NSDateFormatter, когда на iPhone установлены 12-часовые часы - PullRequest
6 голосов
/ 22 сентября 2010

Я использую NSDateFormatter для форматирования NSDate в формате «ЧЧ: мм» на «ДД ММММ ГГГГ».

Это код, который я написал:

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"];
[dateFormatter setLocale:[NSLocale currentLocale]];

Затем я обновляю метку для отображения «Данные с 12:45 22 сентября 2010 года», используя метод stringFromDate.

NSString *timeAndDateUpdated = [[NSString alloc] initWithFormat:@"Data from %@.", [dateFormatter stringFromDate:date]]

Метка обновляется правильно, если на iPhone установлено 24-часовое время, но если оно установлено на 12-часовой, на этикетке отображается «Данные из (ноль)».

Кто-нибудь знает, как решить эту проблему?

Спасибо.

Ответы [ 3 ]

14 голосов
/ 02 мая 2012

Я тоже столкнулся с этим.

Похоже, что NSDateFormatter анализирует даты в соответствии с локалью, даже если вы явно указали строку формата даты!

Таким образом, в этом случае 24-часовые часы HH игнорируются, и он пытается выполнить синтаксический анализ с использованием 12-часовых часов, установленных на устройстве.

Способ исправить это - явно переопределить локаль NSDateFormatter; в этом примере установка его в en_US_POSIX заставит использовать 24-часовые часы при разборе часа, т.е.

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
6 голосов
/ 23 сентября 2010

Если дата представлена ​​исключительно пользователю («on» предполагает, что это так), я бы не стал форсировать формат даты. Гораздо удобнее использовать длинные / средние / короткие стили даты и времени, которые ведут себя в соответствии с форматом региона пользователя:

[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];

[timeFormatter setDateStyle:NSDateFormatterNoStyle];
[timeFormatter setTimeStyle:NSDateFormatterMediumStyle];

NSString * timeAndDate = [NSString stringWithFormat:"%@ on %@",
  [timeFormatter stringFromDate:date],
  [dateFormatter stringFromDate:date]];

Также обратите внимание, что настройка NSDateFormatter невероятно дорогая (около 10 мс IIRC). Это нормально, если вы собираетесь отображать его только один раз, а не обновлять очень часто, но это делает прокрутку немного медленной, если у вас есть дата на ячейку таблицы. Недавно я ускорил рисование графиков в 50 раз, кэшировав форматеры даты ...

0 голосов
/ 22 сентября 2010

Я запустил этот код на 3.1.2 и 4.1 с настройками 12 и 24 часа, и он работал нормально.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"];
    [dateFormatter setLocale:[NSLocale currentLocale]];

    NSString *timeAndDateUpdated = [NSString stringWithFormat:@"Data from %@.", [dateFormatter stringFromDate:[NSDate date]]];

    NSLog(@"%@", timeAndDateUpdated);

Если этот код не работает для вас, проверьте наличие пользовательских расширений / категорийдля NSDateformatter или NSDate.

...