Я создал категорию для NSDate
, которая может создавать строковое представление даты с названием дня недели, например, четверг 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]);
Это даст мне то, что я хочу, нотеперь я должен сохранить идентификатор локали в списке для использования на испанском языке, я предпочел бы сохранить первый экземпляр с NSDateComponents
, но я не понимаю, почему я получаю забавное значениеиногда.
Я нашел решение для корректировки индекса с помощью этого решения: https://stackoverflow.com/a/3524462/662605
Однако, если честно, я не хотел бы использовать это вместе с NSDateComponents
,Я бы предпочел использовать NSDateFormatter
, но в целом было бы здорово исправить первый пример, который дает мне ложное значение weekdayOrdinal
.
Есть идеи по этому поводу?