2015-12-03 15 views
2

我有能夠產生兩種不同類型的時間值的JSON請求。這兩種方式都是UTC時間,但我需要將其轉換爲當地時間。夫特JSON時間值到本地時區

2015-12-01T13:05:33+00:00 

1:05:33 PM 

我的嘗試。

let dateFormatter = NSDateFormatter() 
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle //Set time style 
dateFormatter.timeZone = NSTimeZone() 
let localDate: NSDate? = dateFormatter.dateFromString(time1) 
print(localDate) 

這就是我得到的結果。 2000-01-01 19:05:33 +0000如果我使用1:05:18 PM值。

用於獲取JSON值線。

let time1 = json["results"]["time1"].string! 

回答

1

OK,一兩件事情事情:

  1. 解析是RFC 3339/ISO 8601字符串:

    let string = "2015-12-01T13:05:33+00:00" 
    
    let rfc3339Formatter = NSDateFormatter() 
    rfc3339Formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
    rfc3339Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
    let date = rfc3339Formatter.dateFromString(string) 
    

    注意,我給自己定的語言環境(如每Technical Q&A 1480)。但由於日期字符串包含時區信息,因此我可以使用格式化程序的Z字符,以便正確解釋時區。

  2. NSDate對象做有一個與之相關的時區。事實上,如果我們這樣做print(date)我們在前面的步驟成功解析,它會告訴我們,在NSDate GMT/UTC,即使原來的字符串是在不同的時區。

    一個時區,當您使用格式化這個NSDate轉換回一個新的字符串被呈現給用戶纔有意義。因此,我們可以使用一個單獨的格式創建輸出字符串:

    let userDateFormatter = NSDateFormatter() 
    userDateFormatter.dateStyle = .MediumStyle 
    userDateFormatter.timeStyle = .MediumStyle 
    let outputString = userDateFormatter.stringFromDate(date!) 
    

    因爲這不指定時區,將創建在用戶的本地時區的字符串。而且由於我們不會覆蓋locale並使用.dateStyle.timeStyle,因此在創建要呈現給最終用戶的字符串時,它會使用設備的當前本地化設置來顯示它。

  3. 現在,如果你確實收到UTC的時間(沒有包括時區?!讓人驚訝,這是一個非常糟糕的設計看,在JSON,恕我直言),那麼你必須指定時區:

    let string = "1:05:33 PM" 
    
    let utcTimeStringFormatter = NSDateFormatter() 
    utcTimeStringFormatter.dateFormat = "hh:mm:ss a" 
    utcTimeStringFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
    let time = utcTimeStringFormatter.dateFromString(string) 
    

    現在,我們有time,包含由該字符串表示的時間NSDate。但是,NSDate對象本身並沒有時區。只有當我們轉換回一個字符串爲最終用戶會看到我們在當地時區的時間:

    let userTimeFormatter = NSDateFormatter() 
    userTimeFormatter.timeStyle = .MediumStyle 
    let outputString = userTimeFormatter.stringFromDate(time!) 
    
+0

這是很大的幫助。感謝您處理這兩種格式。我能夠使它以任何一種格式工作。現在,我必須糾正代碼,以便我可以在json文件中重複使用它。 – MwcsMac

+0

解析你的JSON時重複使用它的關鍵是保存那些'NSDateFormatter'對象,所以你不會反覆實例化它們。 (所以,例如,避免在每次調用方法時創建一個實例化日期格式化程序的擴展)。實例化一個'NSDateFormatter'(甚至改變'dateFormat' /'dateStyle' /'timeStyle')的過程相對比較簡單昂貴, – Rob

0

您可以通過設置你的本地時區中,或通過設置GMT

formatter.timeZone = NSTimeZone.localTimeZone() 

OR

formatter.timeZone = NSTimeZone(abbreviation: "GMT") 

只是儘量讓我知道,如果你仍然面臨錯誤!