Ios NSDateComponents的序号工作日索引

Ios NSDateComponents的序号工作日索引,ios,nsdate,Ios,Nsdate,我已经为NSDate创建了一个类别,它可以用工作日名称创建日期的字符串表示,例如1月5日星期四 我想获得工作日索引并使用定制的工作日数组,这些数组存储在plist中,并本地化为英语和西班牙语 然而,使用NSDateComponents给了我一些意想不到的结果。我正在请求NSWeekdayOrdinalCalendarUnit和NSWeekdayCalendarUnit,并将结果输出到日志,得到以下示例: NSDateComponents *components = [[NSCalendar

我已经为
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
的实例,但我不明白为什么有时会得到一个有趣的值

我确实找到了一个解决方案,用这个解决方案调整索引:

但是,老实说,我不想将其与
NSDateComponents
一起使用,我更愿意使用
NSDateFormatter
,但总的来说,修复第一个示例会很酷,它会给我一个错误的
weekdayOrdinal


有什么想法吗?

我想你误解了
工作日顺序的意思。根据
NSDateComponents
的文档,获取
weekdayOrdinal
返回接收方的工作日单位序号,其中工作日序号单位为工作日在下一个较大日历单位内的位置,如月份。例如,2是该月第二个星期五的工作日序号单位”


根据这种推理,2012-01-05的
工作日顺序正确地为1b/c,这是一个月的第一个星期四。

当我记录日期时,我发现
[myDate descriptionWithLocale:[NSLocale currentLocale]]
为此类内容提供了更好的格式。很抱歉,我没有掌握这一点,请你再给我举一个例子好吗?我想有序工作日是指该工作日的索引,该周从周一开始,非有序工作日是指该周从周日开始的工作日索引?我想我知道了,所以是该月的第四个周一是否将weekdayOrdinal=4?谢谢。我将使用
weekdayOrdinal:-1
添加该选项,返回该月最后一周的工作日,例如10月的最后一个星期三。