setFirstWeekday不起作用

时间:2012-11-23 14:19:47

标签: objective-c nsdate nscalendar

我有一个问题: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

1 个答案:

答案 0 :(得分:4)

问题是你真的在这里处理三个独立的对象:NSCalendar,NSDate和NSDateFormatter(它不使用你创建的NSCalendar对象)。这三者没有隐含的联系;当您将NSDate传递给日期格式化程序时,您将使用修改后的工作日完全拉出自定义NSCalendar。请记住:NSDate对象只是从参考点开始的时间度量(例如,格林威治标准时间午夜1月1日的秒数)......它是具有“日名称”概念的日历对象,日常规, “对于那段时间的衡量标准。

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

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);