Предпочтительный часовой формат для локали в шаблоне формата даты - PullRequest
0 голосов
/ 17 ноября 2018

При создании форматов даты из шаблона с использованием DateFormatter Foundation для локали "de", например:

let locale: Locale = Locale(identifier: "de")
let format = DateFormatter.dateFormat(fromTemplate: "dMMMyGhhmmss",
                                      options: 0,
                                      locale: locale)

Я всегда получаю этот формат:

d. MMM y G, h:mm:ss a

, что делает

17. Nov. 2018 n. Chr., 8:30:20 PM

Часть 'PM' необычна для Locale "de", но, насколько я понимаю, этот метод также учитывает предпочтения пользователя. Это правильно?

Я поиграл с настройками в Системных настройках, например Переход на 24-часовые часы, но ничего, что я изменил, не дало никакого эффекта Нужно ли что-то перезапускать, чтобы изменения вступили в силу?

Может кто-нибудь объяснить мне, что происходит?

1 Ответ

0 голосов
/ 18 ноября 2018

Если вы используете h или H в шаблоне, формат будет содержать указанный часовой формат (12-часовой или 24-часовой), независимо от локали.Вместо этого используйте j.Этот символ запрашивает предпочтительный часовой формат для локали.

Например, учитывая шаблон dMMMyGjjmmss, я получаю:

  • MMM d, y G, h:mm:ss a (12-часовой формат) для локали"en"
  • d. MMM y G, HH:mm:ss (24-часовой формат) для локали "de"

документация Apple состояния:

Строка формата использует шаблоны формата из Технического стандарта Unicode # 35.

Технический стандарт Unicode # 35 имеет то же самое для символа j:

Это символ специального назначения.Это не должно встречаться в данных шаблона или скелета.Вместо этого он зарезервирован для использования в скелетах, передаваемых API-интерфейсам, выполняющим гибкую генерацию шаблона даты.В таком контексте он запрашивает предпочтительный часовой формат для локали (h, H, K или k), что определяется тем, используется ли h, H, K или k в стандартном коротком временном формате для локали.В реализации такого API «j» должен быть заменен на h, H, K или k перед началом сопоставления с данными доступных форматов.Обратите внимание, что использование j в скелете, переданном в API, является единственным способом заставить скелет запросить предпочтительный тип временного цикла локали (12 или 24 часа).

...