Порядковый индекс дня недели от NSDateComponents - PullRequest
4 голосов
/ 06 января 2012

Я создал категорию для 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.

Есть идеи по этому поводу?

1 Ответ

11 голосов
/ 06 января 2012

Я думаю, вы неправильно понимаете, что означает weekdayOrdinal.Согласно документу для NSDateComponents, получение weekdayOrdinal возвращает порядковый номер единиц дня недели для получателя, где порядковые единицы дня недели - это «позиция дня недели в следующей более крупной календарной единице, такой как месяц. Например,, 2 - порядковая единица дня недели для второй пятницы месяца ".

Исходя из этого, 2012-01-05 правильно имеет weekdayOrdinal 1 б / с, это первое Четверг месяца.

...