2016-11-05 60 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」,但該聲明本身沒有任何意義。