来自NSDateComponents的序数工作日索引

时间:2012-01-06 15:24:21

标签: ios nsdate

我为NSDate创建了一个类别,可以使用工作日名称创建日期的字符串表示形式,例如1月5日星期四。

我想得到工作日索引,并使用定制的工作日数组,这些工作日存储在plist中并本地化为英语和西班牙语。

然而,使用NSDateComponents给了我一些意想不到的结果。我正在请求NSWeekdayOrdinalCalendarUnitNSWeekdayCalendarUnit,我将结果输出到日志中,我得到以下示例:

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] 设备oridinal工作日:1

     

2012-01-06 15:05:56.493 MyApp [964:11903] 设备非正常工作日:5

这一天应该是星期四,序数应该是4和非序数5

我不明白1来自哪里。

我找到了一种方法来调整它,以确保我们使用带有NSDateFormatter的格里历,并指定NSCalendar(周的第一个日期为星期一),如下所示: / p>

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,但总的来说,修复第一个给我的例子会很酷假weekdayOrdinal值。

有关于此的任何想法吗?

1 个答案:

答案 0 :(得分:11)

我认为你误解了weekdayOrdinal的含义。根据{{​​1}}的文档,获取NSDateComponents返回接收者的工作日单位的序数,其中工作日序数单位是“下一个较大日历单位中工作日的位置,例如例如,2是该月第二个星期五的工作日序数单位“。

根据这个推理,2012-01-05正好有一个{b}的weekdayOrdinal,这是本月的第一个