2017-09-08 30 views
0

假設我在區域UTC +0200,我想用date保存記錄:2017-10-04。我不喜歡這樣寫道:如何按日期屬性考慮時區的記錄?

service!.date = Calendar.current.date(from: DateComponents(year: date.year, month: date.month, day: date.day))! 

日期保存這樣的:

2017-10-04 22:00:00 +0000 

現在我需要每天顯示的服務。代表問我要服務的date,例如:

2017-10-04 22:00:00 +0000 

一切都很好,記錄被取出並處於正常狀態。

但是假設我將前往另一個國家(UTC +0100),其中的代表問我同樣的date但是這一次它看起來像這樣:

2017-10-04 23:00:00 +0000 

和......無所不取。爲什麼?難道不是同一天嗎?如何解決這個問題?

我如何獲取記錄的謂詞是這樣的:

NSPredicate(format: "date = %@", date as NSDate) 
+0

您需要以相同的格式保存和獲取UTC我認爲 –

+0

你是什麼意思?該應用程序正在生產中......並且所有內容都保存到持久存儲中。現在我需要修復... –

+0

總是與UTC工作必須解決您的問題,你需要轉換爲UTC保存並轉換爲UTC後取它,我不知道我是否瞭解我,對不起我的英語 –

回答

0

如果我理解這個權利,你只關心的日期,而不是時間,但您使用的是NSDate存放,對?問題是NSDate不知道時區。它實際上只是某個時代以來的秒數,將其轉換爲日期的唯一方法是知道您正在轉換的時區。

這裏最好的答案可能是將其存儲爲String,格式如2017-10-04。否則,正如您發現的那樣,時區導致同一天被表示爲不同的Date s。

如果您使用的是iOS 10+,則可以使用NSISO8601DateFormatter來處理此問題,否則可以使用適當的格式配置DateFormatter

或者,您可以繼續將其存儲爲NSDate,但要特別注意,在使用Calendar轉換爲/從日期分量轉換時,請始終指定UTC時區。


如果你需要修復的在生產應用,在這裏最好的解決辦法可能是採用啓發式說,「輪」每個日期,在UTC解釋,到最近的午夜值。這應該有效地恢復用於創建日期的時區。唯一的困難是距離UTC 12小時或更長時間的時區(實際上是UTC + 14:00時區),但我相信這些時區大多隻是無人居住的島嶼,所以您可能沒有任何從這些時區創建的日期。

無論如何,您需要瀏覽所有數據,使用UTC將其轉換爲日期組件,然後檢查小時。弄清楚你是否需要四捨五入才能到達最近的午夜,並相應地調整實際日期。然後,您可以取出更正的日期組件並將其寫回(通過將其轉換回使用UTC的NSDate或將其轉換爲字符串,具體取決於是否修改數據格式)。

既然這是CoreData,如果你要切換到字符串,你可以實現一個自定義的遷移來處理這個。否則,您將需要一些方法來嘗試檢測是否有影響的數據(因爲您不希望在每次啓動時重寫所有日期,只是在解決此問題後的首次啓動時)。

+0

那麼有沒有辦法來處理這個問題?該應用程序正在製作中...並需要解決此問題。 –

+0

不考慮字符串解決方案...因爲它已經作爲NSDate存在。 –

+0

@BartłomiejSemańczyk我已經更新了我的答案和建議。 –

相關問題