时区日期格式问题

TimeZone Date Formatting Issue

我正在尝试从具有多个时区的字符串中获取日期,如果 API returns 时区的缩写如 CSTUTC 但如果 returns EET

则失败
let timeString = "17:32 (EET)"

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

知道问题出在哪里吗?!

可能是因为有多个时区与时区缩写相匹配,或者日期格式化程序的默认日期(1 月 1 日)与所用时区缩写的夏令时不匹配。并非所有国家/地区都使用夏令时,它可能会随时更改。检查此 link。对于所有非美国时区缩写,这也可能会发生。例如 CST 它也用于 "China Standard Time""Chicago Standard Time"。您可以解决该问题,将日期格式化程序 属性 isLenient 设置为 true。请注意,这将导致 2000 年 1 月 1 日的日期可能不正确时区偏移。如果您可以控制字符串输入,则应使用时区标识符而不是其缩写以避免歧义。在解析固定日期格式时,您还应该将日期格式化程序的语言环境设置为 "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"