Возможно, потому что существует более одного часового пояса, который соответствует сокращению часового пояса, или дата по умолчанию для форматера даты (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"