从 UTC 到当地时间不考虑夏令时 swift

From UTC to local time doesn't consider daylight saving swift

我正在使用此函数将 UTC 时间转换为本地时间戳。

    func UTCToLocal(date:String, timeZone: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "H:mm:ss"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone(identifier: timeZone)
    dateFormatter.dateFormat = "h:mm a"
    return dateFormatter.string(from: time)
}

但这不会检查夏令时。所以,我得到一个小时的差异。谁能帮我解决这个问题?


感谢 Leo 解决了这个问题。我已将函数更新为:

    func UTCToLocal(date:String, timeZone: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone(identifier: timeZone)
    dateFormatter.dateFormat = "dd-MM-yyyy hh:mm aa"
    return dateFormatter.string(from: dt!)
}

现在函数参数中的日期字符串的值格式为“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”。这解决了问题。

这里的问题是缺少日期。您始终只传递没有日期的时间组件,因此夏令时将始终对应于 2001 年 1 月 1 日。如果您需要今天的日期,则需要将日期格式化程序 defaultDate 属性 设置为今天的 startOfDay。顺便说一句,在设置固定日期格式之前,不要忘记先将区域设置设置为“en_US_POSIX”。