UTC到当地时间 - 错误的结果迅速

时间:2016-11-28 10:57:35

标签: swift datetime timezone nsdateformatter utc

我知道有很多线程,但我无法找到解决问题的方法。也许我看不到解决方案......

我收到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是现在我当前时区的时间。但我不明白这一点。我明确地给出了应该转换的日期。有人知道我的错误在哪里?

1 个答案:

答案 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)