我有一个问题: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
答案 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);