Проблема форматирования даты в часовом поясе - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь получить дату из строки с несколькими часовыми поясами. Она работает без проблем, если API возвращает зоны с аббревиатурами, такими как CST или UTC, но не работает, если возвращается EET* 1004. *

let timeString = "17:32 (EET)"

let formatter = DateFormatter()
formatter.dateFormat = "HH:mm (zzz)"
let time = formatter.date(from: timeString) // return nil

Есть идеи, в чем может быть проблема ?!

1 Ответ

0 голосов
/ 23 февраля 2020

Возможно, потому что существует более одного часового пояса, который соответствует сокращению часового пояса, или дата по умолчанию для форматера даты (1 января) не соответствует переходу на летнее время в использованном сокращении часового пояса. Не во всех странах используется летнее время, и оно может измениться в любое время. Проверьте эту ссылку . Это, вероятно, произойдет и для всех сокращений часовых поясов за пределами США. Например, CST используется также для "China Standard Time" и "Chicago Standard Time". Вы можете обойти эту проблему, установив для свойства форматирования даты isLenient значение true. Обратите внимание, что это приведет к дате 1 января 2000 года с возможно неправильным смещением часового пояса. Если у вас есть контроль над вводом строки, вы должны использовать идентификаторы часового пояса вместо его сокращений, чтобы избежать двусмысленности. При синтаксическом анализе фиксированного формата даты вы также должны установить языковой стандарт форматера даты на "en_US_POSIX", чтобы форматер даты не отражал языковой стандарт и настройки устройства пользователя:

let timeString = "17:32 (EET)"
let formatter = DateFormatter()
formatter.locale = .init(identifier: "en_US_POSIX")
formatter.dateFormat = "HH:mm (zzz)"
formatter.isLenient = true
let date = formatter.date(from: timeString) // "Jan 1, 2000 at 1:32 PM" "BRT Brazilian Standard Time" 

Таким образом, вы должны использовать "GMT+2" или "GMT-3" для избегать двусмысленности или как я уже предлагал использовать его идентификаторы "HH:mm (VV)" т.е. "Europe/Athens" или "America/Sao_Paulo"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...