2016-05-17 55 views
4

我正在建立的系統有一個事件組件,其中的一部分就是創建循環事件的能力。在我的數據庫中,我使用UTC存儲所有事件。當用戶日曆上顯示重複事件時,應始終顯示在「牆上時間」中。因此,例如,如果我每週三下午1:00創建一個週期性事件,無論夏時制是否變化,它都應始終在下午1:00。防止DST轉換與moment.js對於經常性事件

我遇到的問題是,每當我嘗試使用Moment.js格式化此日期時,Moment始終會考慮DST移位並相應地更新事件。以我以前的例子爲例,2016年,DST班次發生在3月13日,所以如果我的預約是在2016年2月預訂的,那麼直到3月13日的每個預約都會正確輸出爲下午1:00。 3月13日之後,DST班次已經實施,我的所有活動現在都提前了一個小時。

是否有推薦的方法來處理這個問題?我似乎無法找到一種方法讓Moment「忽略」DST,也無法在搜索時找到合適的解決方案。

不知道這有多重要,但我在輸出日期時使用Moment Timezone轉換爲用戶的本地時區。

謝謝!

+1

時間處理總是有問題,在這種情況下,您不需要將用戶規則轉換爲utc時間戳,將其存儲爲「晚上11點」。並且每次顯示時計算所有下一個事件。爲什麼?由於DST規則/偏移量可能發生變化,因此您無法計算任何未來事件的正確UTC時間。 –

回答

4

作爲最佳實踐,將來的日期應該在當地時間存儲。這是因爲,正如評論中指出的那樣,時區規則可以並且確實會改變。因此,您無法提前正確計算當地時間的正確UTC時間。

當您存儲未來日期時,應該將其與IANA時區一起存儲,用戶期望事件時間處於該時區。然後,您實際上會做與您現在正在進行的轉換相反的操作。如果您需要了解事件在全球時間表上的確切點,您可以將本地時間轉換爲UTC。

請注意IANA時區數據庫經常更新。目前版本爲2016d,這意味着它已經在今年更新了四次。如果您的應用程序將在多個國家/地區使用,則需要非常勤奮地持續更新時刻以適應變化。

至於爲什麼你現在看到你的UTC日期沒有正確改變 - 我想你已經把你的預定日期,轉換爲UTC,然後計算你的重現時間。當你使用UTC進行日期數學計算時,它不會正確解釋DST偏移,因爲它不知道它們。因此,當時刻把這個日期轉換回本地時,它將會關閉一個小時。如果您要在當地時間進行日期數學計算,然後轉換爲UTC進行存儲,則您的轉換返回將是正確的。提供時區規則沒有改變。不要這樣做 - 在當地時間存儲日期。

+0

感謝您的詳細解釋,Maggie!正是我需要的。謝謝:D – jdixon04

+0

如果您有興趣,我會在本視頻中詳細討論這一點:https://www.youtube.com/watch?v=ieIzNP6gKqU 此外,馬特約翰遜有一個複雜的課程,涵蓋它更徹底: https://app.pluralsight.com/library/courses/date-time-fundamentals –

+0

我一定會觀看視頻。我讀過的所有內容都推向了以UTC存儲所有內容,所以當我遇到問題時有點驚訝。 – jdixon04