从 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”。
我正在使用此函数将 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”。