2017-04-21 108 views
2

我被這種行爲感到困惑:爲什麼dateformatter.date()默認返回UTC?

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz" 
let result = dateFormatter.date(from: "2017-04-12 12:12:12 GMT+1")! 

2017年4月12日11時12分12秒UTC

爲什麼結果自動轉換爲UTC?我怎樣才能獲得相同的時區?

+0

處理一個標準化系統(如Unix時間戳或UTC時間)使得處理這個數據MUUUUUUCH更容易。當你比較兩個表示相同時間點但在不同時區的'Date'實例時,你會期望發生什麼? – Alexander

+0

是的,這是有道理的。但我如何實現上述目標? – Houman

+1

可以這樣想:Date是表示時間的數據類型。它不知道任何關於時區,日期,月份,年份等的信息。無論您是希望在格林威治時間格林威治標準時間+1還是中國日曆中及時表達某一時刻,代表它們的「日期」都是一樣。這是其他'DateFormatter'和其他像它一樣的結構(例如'Calendar','DateComponents')的工作,可以根據某些規則集合(日曆系統指定的)將'Date'轉換爲人類表示)。 – Alexander

回答

0

Date對象封裝在單個時間點,獨立於任何特定 曆法系統或時區的。日期對象爲 不可變,表示相對於絕對引用日期的不變時間間隔。

這是一種國際標準,使UTC格式化爲默認輸出。所有其他環境中的大多數系統/語言也通過此默認數據類型處理時間。

您可以更改輸入/輸出格式爲您的目的。

let dateString = "Thu, 22 Apr 2017 00:28:17 +0000" 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "EEE, dd MMM yyyy hh:mm:ss +zzzz" 
dateFormatter.locale = Locale.init(identifier: "en_GB") 
let dateObj = dateFormatter.date(from: dateString) 
dateFormatter.dateFormat = "dd-MM-yyyy" 
print("Dateobj: \(dateFormatter.string(from: dateObj!))") 
+0

謝謝。這不是swift3代碼,但即使在轉換後,也不會起作用。 'TimeZone.current.identifier'已經被'歐洲/倫敦' – Houman

+0

糾正爲swift3 - 它現在有效嗎? – Felix

+1

這個答案並不正確。 「日期」只是一個時間點的表示。而已。這不是UTC。 UTC直到「日期」轉換爲「字符串」纔會發揮作用。默認情況下,Date的'description'或'debugDescription'就是'Date'到String的轉換,而字符串恰好顯示在UTC時區。 – rmaddy