NSDateFormatter добавляет AM / PM, когда формат даты его не определяет

#objective-c #nsdateformatter

#objective-c #nsdateformatter

Вопрос:

У меня есть простой код, который преобразует дату в строку:

   (NSString *)dateStringFromDate:(NSDate *)date {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    return [dateFormatter stringFromDate:date];
}
  

Я бы ожидал, что строка будет выглядеть:

 2020-10-19T11:55:29Z
  

Но вместо этого он выводит строку, подобную этой:

 2020-10-19T12:38:06 p.m.Z
  

Обратите внимание на «p.m.» в выводе. Я не использую символ формата даты «a», поэтому я бы не ожидал увидеть AM или PM.

Когда я запускаю код в симуляторе, он выдает правильный результат. Когда я запускаю его на физическом iPad под управлением iPadOS 14.0.1, он выдает неверный результат.

Я заметил, что принудительное изменение локали с помощью этого устраняет проблему:

 dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
  

Но я не уверен, что это правильный подход, поскольку это похоже на ошибку.

Может кто-нибудь пролить свет на то, почему это происходит?

Комментарии:

1. Это из-за локального значения по умолчанию NSDateFormatter . Но если вы посмотрите на «am / mp» NSDateFormatter en_us_posix», вы обнаружите множество «проблем». Так что да, вам нужно использовать en_us_posix . Вы iPad, как я полагаю, используете систему AM / MP в своих настройках, нет? Но вас может заинтересовать developer.apple.com/documentation/foundation /.

2. Спасибо за ваш ответ. Есть ли какая-то причина, по которой это не было проблемой до iPadOS 14? Мы никогда не видели этого раньше 14.x.

3. @Larme если бы вы хотели отправить свой комментарий в качестве ответа, я бы пометил его как принятый. Ваш комментарий помог. Спасибо!