如何获得Foundation的星期几?


Answers:


216
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
[dateFormatter setDateFormat:@"EEEE"];
NSLog(@"%@", [dateFormatter stringFromDate:[NSDate date]]);

根据当前区域设置,以语言环境的字符串形式输出当前星期几。

要获取一个工作日的编号,您必须使用NSCalendar类:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [comps weekday];

14
而且,让你可以使用所有的工作日名称[dateFormatter weekdaySymbols](以及类似),其在指数0开始返回星期日NSString的的一个NSArray
beetstra

好吧,我如何从星期一开始而不是星期天开始?
弗拉基米尔·斯塔吉洛夫

2
@VovaStajilov可能是这样的问题:stackoverflow.com/questions/1106943/…会有所帮助。基本上,您需要将日历的第一个weekDay设置为星期一([calendar setFirstWeekday:2])
弗拉基米尔·

1
第一个NSLog返回475221968,这对于一周中的某天来说是一个不切实际的庞大数字。。。
coolcool1994

好吧,@Vladimir,我设置[gregorian setFirstWeekday:2];星期一2015年1月6日,我收到2( [components weekday])。为什么?-我在这里
new2ios 2015年

18

只需使用以下三行:

CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
CFTimeZoneRef tz = CFTimeZoneCopySystem();
SInt32 WeekdayNumber = CFAbsoluteTimeGetDayOfWeek(at, tz);

3
我喜欢它,但是对于一些新开发人员来说,这几乎算是一件令人困惑的事情(这可能是一个邪恶的奖励);)
DavidRönnqvist2013年

3
CFAbsoluteTimeGetDayOfWeek在iOS 8中已弃用。是否有使用CFCalendar的替代方法?
Jordan Smith

15

不建议使用此处的许多答案。自iOS 8.4起可以使用,并以字符串和数字的形式显示星期几。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE"];
NSLog(@"The day of the week: %@", [dateFormatter stringFromDate:[NSDate date]]);

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *comps = [gregorian components:NSCalendarUnitWeekday fromDate:[NSDate date]];
int weekday = [comps weekday];
NSLog(@"The week day number: %d", weekday);

1
附带说明–由于的weekday组成部分NSCalendarNSInteger,如果需要,您需要将其强制[comps weekday]转换为int,否则它将显示有关此的警告。
mylogon '16

10

这是您在Swift 3中执行的操作,并获得了本地化的日期名称…

let dayNumber = Calendar.current.component(.weekday, from: Date()) // 1 - 7
let dayName = DateFormatter().weekdaySymbols[dayNumber - 1]

在Swift 3中,应该使用Calendar而不是NSCalendar。
jvarela

7
-(void)getdate {
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];
    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    [format setDateFormat:@"MMM dd, yyyy HH:mm"];
    NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
    [timeFormat setDateFormat:@"HH:mm:ss"];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init] ;
    [dateFormatter setDateFormat:@"EEEE"];

    NSDate *now = [[NSDate alloc] init];
    NSString *dateString = [format stringFromDate:now];
    NSString *theDate = [dateFormat stringFromDate:now];
    NSString *theTime = [timeFormat stringFromDate:now];

    NSString *week = [dateFormatter stringFromDate:now];
    NSLog(@"\n"
          "theDate: |%@| \n"
          "theTime: |%@| \n"
          "Now: |%@| \n"
          "Week: |%@| \n"
         , theDate, theTime,dateString,week); 
}

3

我需要一个简单的(星期几)星期几索引,其中0 =星期日和6 =星期六要用于模式匹配算法。从那里开始,很简单的事情就是使用索引从数组中查找日期名称。这是我想出的不需要日期格式化程序或NSCalendar或日期组件操作的内容:

+(long)dayOfWeek:(NSDate *)anyDate {
    //calculate number of days since reference date jan 1, 01
    NSTimeInterval utcoffset = [[NSTimeZone localTimeZone] secondsFromGMT];
    NSTimeInterval interval = ([anyDate timeIntervalSinceReferenceDate]+utcoffset)/(60.0*60.0*24.0);
    //mod 7 the number of days to identify day index
    long dayix=((long)interval+8) % 7;
    return dayix;
}

2

这是Swift 3的更新代码

代码:

let calendar = Calendar(identifier: .gregorian)

let weekdayAsInteger = calendar.component(.weekday, from: Date())

要将事件的名称打印为字符串:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

let name = datFormat.string(from: Date())

2

我认为这个主题真的很有用,因此我发布了一些与Swift 2.1兼容的代码。

extension NSDate {

    static func getBeautyToday() -> String {
       let now = NSDate()
       let dateFormatter = NSDateFormatter()
       dateFormatter.dateFormat = "EEEE',' dd MMMM"
       return dateFormatter.stringFromDate(now)
    }

}

您可以致电的任何地方:

let today = NSDate.getBeautyToday()
print(today) ---> "Monday, 14 December"

斯威夫特3.0

正如@ delta2flat所建议的那样,我更新了答案,使用户能够指定自定义格式。

extension NSDate {

    static func getBeautyToday(format: String = "EEEE',' dd MMMM") -> String {
        let now = Date()
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.string(from: now)
    }

}

这是本地化的吗?如果您想要的国家/地区想要使用“ 12月14日,星期一”或“ 12月14日星期一”,该怎么办?应该在其中处理
delta2flat

嗨@ delta2flat。是的,格式已本地化。顺便说一句,我已经更新了答案:现在用户可以指定自定义格式
Luca Davanzo

太好了-我发现Objective-C / Cocoa Touch可以根据语言环境对字符串进行本地化,功能非常强大。
delta2flat

您的Swift 3扩展名应该是Date而不是NSDate。
里昂,


1

这样,它就可以在Swift中工作:

    let calendar = NSCalendar.currentCalendar()
    let weekday = calendar.component(.CalendarUnitWeekday, fromDate: NSDate())

然后将工作日分配给所得的数字。


1
NSDate()返回GMT + 0的当前日期,对吗?您仅在此处使用NSDate,否则日历组件将自动检测当前的语言环境和时移?
迪马·德普洛夫

0

我有一个很奇怪的问题是每天有一天。仅设置firstWeekday是不够的。设置时区也是必要的。我的工作解决方案是:

 NSCalendar* cal = [NSCalendar currentCalendar];
 [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
 [cal setFirstWeekday:1]; //Sunday
 NSDateComponents* comp = [cal components:( NSWeekOfMonthCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekCalendarUnit)  fromDate:date];
 return [comp weekday]  ;


0
self.dateTimeFormatter = [[NSDateFormatter alloc] init];
self.dateTimeFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; // your timezone
self.dateTimeFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"zh_CN"]; // your locale
self.dateTimeFormatter.dateFormat = @"ccc MM-dd mm:ss";

我们可以使用三种符号来格式化星期几:

  • Ë
  • Ë
  • C

以下两个文档可能会对您有所帮助。

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html

http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns

演示:

您可以在此网站上测试您的模式:

http://nsdateformatter.com/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.