2

我有一个问题:setFirstWeekDay不起作用...我不知道为什么...

 NSCalendar *gregorianT = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [gregorianT setFirstWeekday:2];
 NSDateFormatter *formatDayWeek = [[NSDateFormatter alloc] init];
    [formatDayWeek setDateFormat:@"c EEEE"];

    NSLog(@"date : %@  value for date : %@", dateForMonth, [formatDayWeek stringFromDate:dateForMonth]);

这就是我得到的:

date : 2012-11-23 14:18:28 +0000  value for date : 6 Friday

我应该得到date : 2012-11-23 14:18:28 +0000 value for date : 5 Friday

4

1 回答 1

4

问题是您在这里实际上是在处理三个单独的对象:一个 NSCalendar、一个 NSDate 和一个 NSDateFormatter(它没有使用您创建的 NSCalendar 对象)。这三者没有隐含的联系。当您将 NSDate 传递给日期格式化程序时,您完全将您的自定义 NSCalendar 与修改后的工作日排除在等式之外。请记住:NSDate 对象只是从参考点开始的时间度量(例如从 2001 年 1 月 1 日午夜 GMT 算起的秒数)......它是具有“日名称”概念的日历对象,“日序数”, " 等时间的度量。

如果您想查看修改后的序数,请将您的日历对象传递给格式化程序:

NSCalendar *gregorianT = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorianT setFirstWeekday:2];

NSDateFormatter *formatDayWeek = [[NSDateFormatter alloc] init];
[formatDayWeek setCalendar:gregorianT];
[formatDayWeek setDateFormat:@"c EEEE"];

NSLog(@"Value for date: %@", [formatDayWeek stringFromDate:dateForMonth]);

...或者您可以直接从您的 NSCalendar 对象访问序数。

NSCalendar *gregorianT = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorianT setFirstWeekday:2];

NSUInteger valueOfDay = [gregorianT ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:dateForMonth];

NSLog(@"Value for date : %ld", (long)valueOfDay);
于 2012-11-23T15:39:18.013 回答