【发布时间】:2012-01-06 15:24:21
【问题描述】:
我为NSDate 创建了一个类别,它可以创建一个带有工作日名称的日期的字符串表示形式,例如1 月5 日星期四。
我想获取工作日索引并使用自定义的工作日数组,该数组存储在 plist 中并本地化为英语和西班牙语。
但是使用NSDateComponents 给了我一些意想不到的结果。我同时请求 NSWeekdayOrdinalCalendarUnit 和 NSWeekdayCalendarUnit 并将结果输出到日志中,我得到以下示例:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSWeekdayOrdinalCalendarUnit | NSWeekdayCalendarUnit fromDate:self];
NSInteger weekdayOrdinal = [components weekdayOrdinal];
NSInteger weekdayNonOrdinal = [components weekday];
NSLog(@"Date: %@", [self description]);
NSLog(@"Device oridinal weekday: %d", weekdayOrdinal);
NSLog(@"Device non-oridinal weekday: %d", weekdayNonOrdinal);
2012-01-06 15:05:56.492 MyApp[964:11903] 日期:2012-01-05 16:13:46 +0000
2012-01-06 15:05:56.492 MyApp[964:11903] 设备原始工作日:1
2012-01-06 15:05:56.493 MyApp[964:11903] 设备非原始工作日:5
这天应该是星期四,序数应该是 4 而非序数应该是 5
我不明白 1 是从哪里来的。
我找到了一种方法来调整它以确保我们使用带有NSDateFormatter 的公历并指定NSCalendar(一周的第一个日期是星期一),如下所示:
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setFirstWeekday:2];
NSUInteger adjustedWeekdayOrdinal = [gregorian ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:self];
NSDateFormatter *weekdayF = [[[NSDateFormatter alloc] init] autorelease];
[weekdayF setDateFormat: @"EEEE"];
[weekdayF setCalendar:gregorian];
[weekdayF setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"]];
NSLog(@"The day of the week is: %@", [weekdayF stringFromDate:self]);
这会给我我想要的,但现在我必须将语言环境标识符存储在 plist 中以在西班牙语中使用,我更愿意保留带有 NSDateComponents 的第一个实例,但我不明白我为什么有时会得到一个有趣的值。
我确实找到了使用此解决方案调整索引的解决方案:https://stackoverflow.com/a/3524462/662605
但是,老实说,我不想将它与NSDateComponents 一起使用,我宁愿使用NSDateFormatter,但总的来说,修复第一个给我错误@987654333 的示例会很酷@值。
对此有什么想法吗?
【问题讨论】:
-
当 NSLogging 日期我发现
[myDate descriptionWithLocale:[NSLocale currentLocale]]提供了更好的格式这种类型的东西。