2016-11-05 64 views
0

我有一个字符串从服务器得到 我把这个字符串转换成NSDate由这个甲酸盐。转换UTC NSDate到本地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时,它再次显示了我作为参数得到的日期和时间。

+0

不要在日期格式中引用'Z'。你不想要一个字面的'Z'。你想把它当作时区来对待。 – rmaddy

回答

2

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

+0

你能引用一个使用NSDateComponent来计算时间的例子吗? 例如,将45分钟增加到11:33 PM,我们如何将它转换为12:18 AM –

+0

每个组件(年,月,日,小时,分钟......)都是整型。只需添加它们。 – vikingosegundo

+0

知道了.. 非常感谢... –

0

NSDate没有时区。这是一个时间点,独立于任何事物,尤其是时区。您不能“将UTC NSDate转换为本地NSDate”,但该声明本身没有任何意义。