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

时间:2016-11-05 13:02:37

标签: ios swift nsdate nsdateformatter

我有一个从服务器获取的字符串"yyyy-MM-dd'T'HH:mm:ss.SSS'Z" 我通过这种格式将此字符串转换为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"但当我转换此字符串并返回NSDate对象时,它不会根据我当地时间更改时间。我在timeStamp字符串中获取了正确的时间(在上面的代码中)。但是当我尝试将timeStamp字符串转换为NSDate时,它再次显示我作为参数获得的日期和时间。

2 个答案:

答案 0 :(得分:2)

你不应该改变NSDate的时间。 NSDates只是一个时间点,按秒计算。他们不知道时区,天,月,年,小时,分钟,秒......如果直接打印,他们将始终以UTC格式输出时间。
如果您更改日期以显示您的时区时间,您实际上正在改变UTC的​​时间 - 因此您的日期将代表另一个时间点,无论时区如何。
通过不改变它们来保持它们完好无损,而是当你需要显示它们时,通过日期格式化器来完成它们 如果您需要进行独立于时区的时间计算,您也可以使用NSDateComponents。

答案 1 :(得分:0)

NSDate没有时区。它是一个时间点,独立于任何事物,尤其是时区。您无法将UTC NSDate转换为本地NSDate",该语句本身没有任何意义。