我使用此函数将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!)
}
现在函数paramter中的日期字符串具有这种格式的值";yyyy-MM-dd'HH:MM:ss.SSS'Z'";。这就解决了问题。
这里的问题是缺少日期。您总是只经过时间组成部分而不经过日期,因此夏令时将始终与2001年1月1日相对应。如果需要今天的日期,则需要将日期格式化程序defaultDate属性设置为今天的startOfDay。顺便说一句,在设置固定日期格式之前,不要忘记先将区域设置为"en_US_POSIX"。