我知道有很多线程,但我无法找到解决问题的方法。也许我看不到解决方案......
我收到UTC时间:例如12:50 我希望这次将MEZ分别转换为用户设备的时区。对于我的例子,我期望13:50,因为atm是MEZ +1到UTC。
这是我的代码
//transform date to string
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
let newDateAsString:String = dateFormatter.string(from: self)
//is 12:50 UTC
//transform date to MEZ respectively to the local device timezone
let dateFormatterToDate = DateFormatter()
dateFormatterToDate.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let timeZone = TimeZone.autoupdatingCurrent.identifier as String
dateFormatter.timeZone = TimeZone(identifier: timeZone)
//same result with: dateFormatter.timeZone = NSTimeZone.local
//result is 11:50 but i would expect 13:50
if let result = dateFormatterToDate.date(from: newDateAsString) {
return result
}
结果11:50是现在我当前时区的时间。但我不明白这一点。我明确地给出了应该转换的日期。有人知道我的错误在哪里?
答案 0 :(得分:1)
您正在进行的转换与您的意图相反。字符串newDateAsString
(时间为12:50)未指定时区,因为日期格式字符串不包含时区的格式。当您将dateFormatterToDate
的时区设置为MEZ并将newDateAsString
传递给dateFormatterToDate
时,您说:在MEZ中以12:50为我提供Date
个对象。
默认日期显示为UTC,因此result
显示为11:50,因为MEZ中的12:50是UTC中的11:50。
要将日期格式化为本地时区的字符串,您可以使用以下代码:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = NSTimeZone.local
let localTimeZoneDateString = dateFormatter.string(from: self)