【问题标题】:Ordinal weekday index from NSDateComponents来自 NSDateComponents 的有序工作日索引
【发布时间】:2012-01-06 15:24:21
【问题描述】:

我为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] 设备原始工作日: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]] 提供了更好的格式这种类型的东西。

标签: ios nsdate


【解决方案1】:

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

根据这个推理,2012-01-05 正确地有 1 b/c 的 weekdayOrdinal,它是本月的第一个星期四。

【讨论】:

  • 对不起,我没有理解这一点,请你再给我一个例子吗?我以为序数工作日是指从星期一开始的那个工作日的索引,而非序数是从星期日开始的工作日索引?
  • 我想我明白了,所以本月的第四个星期一会有 weekdayOrdinal = 4 ?谢谢
  • 我会补充一点,使用 weekdayOrdinal: -1 返回该月最后一周的工作日,例如十月的最后一个星期三。
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 2014-12-16
  • 2011-10-02
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多