ios - 来自 NSDateComponents 的有序工作日索引

标签 ios nsdate

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

我想获取工作日索引并使用自定义的工作日数组,这些工作日存储在 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] Date: 2012-01-05 16:13:46 +0000

2012-01-06 15:05:56.492 MyApp[964:11903] Device oridinal weekday: 1

2012-01-06 15:05:56.493 MyApp[964:11903] Device non-oridinal weekday: 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,但总的来说修复它会很酷第一个例子给我一个错误的 weekdayOrdinal 值。

对此有什么想法吗?

最佳答案

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

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

关于ios - 来自 NSDateComponents 的有序工作日索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8760130/

相关文章:

ios - 将蒙版的大小更改为带有动画的方向

ios - 如何通过 NSDate 加载带有今天日期的文本字段?

objective-c - NSDateComponents 返回 nil

ios - 将 NSDate 转换为 JSON 日期?

ios - 计算用户 Action

iOS swift Aspect Fit 左放置

arrays - 从 CoreData 获取给定属性具有相同值的对象?

objective-c - iOS 4.3 的 NSDate 完整日期

iphone - 如何在 UIWebView 上模拟点击事件?

ios - 如何拆除核心数据堆栈?