Nsdateformatter форматирует часы в диапазоне от 0-24 с некоторыми международными настройками

Одна конкретная дата и конфигурация локали iOS заставляет NSDateFormatterиметь действительно странное поведение. Он игнорирует мои строки формата и форматирует часы со значением из диапазона 0-24.

#define DATE_FORMAT "yyyy-MM-dd HH:mm:ssZ"
formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @DATE_FORMAT;
return [formatter stringFromDate:value];

С пользовательским форматом: "yyyy-MM-dd'T'HH:mm:ssZ"он возвращает даты, как это » 2016-05-26 197: 33: 17 PM + 0000″

'T'Между частями даты и времени и 197 часами нет символа.

NSDateFormatter с помощью пользовательского формата "yyyy-MM-dd'T'HH:mm:ss"не удается разобрать строку «2016-05-26T07:32:57» и возвращает nil.

Это происходит не только с моими пользовательскими форматтерами. Внутренние учредители учредительства ответственные для descriptionстрадают от этой проблемы либо:

(lldb) po value.description
2016-05-27 44:20:27 AM +0000

Введите описание изображения здесь
Введите описание изображения здесь

Я воспроизвожу это поведение с определенными региональными настройками системы в iOS 9.3.2:

"General">"Date & Time">"24-Hour Time" OFF
"General">"Date & Time">"Set Automatically" OFF
"General">"Date & Time">"Time Zone" Moscow

"General">"International">"Language" Русский (Russian)
"General">"International">"Prefferred language order" Русский (Russian), English (U.S.)
"General">"International">"Regional Format"  Russia
"General">"International">"Calendar" Gregorian

Введите описание изображения здесь
Введите описание изображения здесь

Это единственная конфигурация, которую я знаю на данный момент, которая заставляет formatters работать таким образом.

Кто-нибудь знает, как это исправить? Я буду признателен за любые идеи, как это проанализировать, потому что у меня нет своего собственного.

1 ответ

  1. На основе комментариев rmaddy и Rob правильным решением в данной ситуации является указание локали «en_US_POSIX» для всех форматтеров, участвующих в сериализации объектов NSDate.

    Поэтому вырезанная в вопросе часть должна быть:

    #define DATE_FORMAT "yyyy-MM-dd HH:mm:ssZ"
    formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @DATE_FORMAT;
    
    formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
    
    return [formatter stringFromDate:value];
    

    Для всех, у кого есть одна и та же ссылка на выпуск, опубликованная Робом, была бы чрезвычайно полезной.
    См. Технический Q & A 1480. Я бы рекомендовал вам прочитать его перед применением этого решения к вашему коду.