NSDateFormatter, когда iPhone настроен на 12-часовой формат

Я использую 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 часов, на метке отображается «Данные из (нуль)».

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

Спасибо.


person Tom W    schedule 22.09.2010    source источник
comment
Я думаю, что мой ответ ниже, вероятно, должен быть принятым ответом на этот вопрос. Можете ли вы изменить OP, если вы согласны?   -  person Nathan Brown    schedule 17.05.2016


Ответы (3)


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

[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 раз, кэшируя средства форматирования даты...

person tc.    schedule 23.09.2010
comment
Спасибо. Я подумал, что будет нормально принудительно использовать формат данных, потому что приложение будет доступно только в Великобритании. Все еще лучше использовать ваш метод? Кроме того, дата отображается на экране один раз и меняется не так часто. - person Tom W; 23.09.2010
comment
Пользователь по-прежнему может настроить формат даты (например, 12-часовой или 24-часовой); как правило, следует уважать пожелания пользователя. - person tc.; 24.09.2010

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

Похоже, что даты анализируются 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]];
person Nathan Brown    schedule 01.05.2012
comment
Спасибо за обновление stackoverflow, Натан, и добро пожаловать, проголосовали. - person Maarten Bodewes; 08.05.2012

Я запустил этот код на 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.

person TyB    schedule 22.09.2010