将 UTC NSDate 转换为本地 NSDate 不起作用

Convert UTC NSDate into Local NSDate not working

我有一个从服务器获取的字符串 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z" 我通过这个 formate 将这个字符串转换成 NSDate。

class func convertUTCDateToLocateDate(dateStr:String) -> NSDate{
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        dateFormatter.timeZone = NSTimeZone(name: "UTC")
        let date = dateFormatter.dateFromString(dateStr)


    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z"
    dateFormatter.timeZone = NSTimeZone.localTimeZone()
    let timeStamp = dateFormatter.stringFromDate(date!)
    let dateForm = NSDateFormatter()
    dateForm.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateForm.timeZone = NSTimeZone.localTimeZone()
    let dateObj = dateForm.dateFromString(timeStamp)
    return dateObj!
}

假设参数字符串是“2016-11-05T12:00:00.000Z”但是当我转换这个字符串和return一个NSDate对象时它不会根据我的当地时间。我在 timeStamp 字符串中得到了正确的时间(在上面的代码中)。但是当我尝试将 timeStamp 字符串转换为 NSDate 时,它​​再次显示我作为参数获得的日期和时间。

您不应该更改 NSDate 的时间。 NSDates 只是一个时间点,以秒计算。他们不知道时区、日、月、年、小时、分钟、秒……如果直接打印,他们将始终以 UTC 格式输出时间。
如果您更改日期以显示您所在时区的时间,您实际上是在更改 UTC 时间——因此您的日期将代表另一个时间点,而与时区无关。
通过不更改它们来保持它们的完整性,而是在您需要显示它们时通过日期格式化程序进行。
如果您需要进行独立于时区的时间计算,您也可以使用 NSDateComponents。

NSDate 没有时区。这是一个时间点,独立于任何事物,尤其是时区。你不能"convert a UTC NSDate to a local NSDate",语句本身没有任何意义。