2014-08-31 157 views
10

我只想要專家的確認。 對於我認爲是在這樣的環境中存儲和處理日期的正確方式,我仍然沒有自信。在MongoDB中存儲日期和時區

我正在開發一個小應用程序,只爲意大利用戶

基本上,他們可以創建,每一個都具有creationDate的列表(我在日期部分有興趣,時間是不是在我的情況下非常有用)。

所以,用戶在「日期」形式字段中輸入以下格式的日期:22/06/2014代表六月的第22天的2014年之後的日期被解析這樣的:

entryData.dateEntry = moment($(form).find('input[name=dateEntry]').val(), 'DD-MM-YYYY').toDate(); 

最後,我的入口模型被添加到backbone.js集合中,並通過Node.js + Express在MongoDB中存儲服務器端。

查詢Mongo的條目,我看到:

2014年6月21日22:00:00 +0000

相當於 「dateEntry」:日期(14033.88億)。

谷歌搜索,我發現MongoDB沒有時區的概念。所有日期都以UTC格式存儲,而我之前創建的日期對象格林尼治標準時間+2。 但我真的很害怕......我怎樣才能以簡單的方式取回當地時區的日期?

接下來,我將在下劃線模板顯示條目數據,這種方式:

<%= moment(dateEntry).format('DD/MM/YYYY') %> 

而且......瞧!我把我當地的'意大利'的約會回來了:22/06/2014。

現在,我的問題:是正確的路要走嗎?

該過程是:解析本地時區中的日期=>存儲在utc =>檢索本地時區中的日期。 這是常見的做法嗎?

我也想過:我不能簡單地避免使用時區和存儲我的本地(意大利)時間,因爲它是utc時間(2014-06-22 00:00:00)? 那麼糟糕?

+1

我設置好一切是UTC前後(數據庫,服務器,客戶端通信,...),在應用程序的最邊緣處理的時區。我通常在Rails中工作,所以我不知道node.js世界中通常會做些什麼。 – 2014-08-31 19:52:44

回答

4

是的,通常的做法是將所有時間戳存儲在UTC中,然後將其轉換爲外層的特定時區。很多框架都會自動爲你做,包括Rails。比方說,如果將來您也開始迎合其他時區,您將不會遇到任何問題,因爲您的數據庫具有UTC條目。您將節省時區轉換的開銷。

如果你只想保存日期,你也可以這樣做,但是我認爲你目前的做法沒有任何壞處 - 以UTC保存所有內容。我不確定node.js,但會有一些設置可以指定(意大利)時區,您的所有轉換都將自動進行。你會發現這個線索有用:

How can I set the default timezone in node.js?

+0

問題在於有些國家根據一年的時間段使用不同的utc偏移量。這使得存儲UTC偏移量成爲必要,以便知道進行某個輸入的實際時間。爲此,Mongo不僅可以存儲'Z',而且可以存儲當地時間戳,這將是有益的。 – tomascharad 2016-02-24 21:46:29

+0

我不這麼認爲。 UTC是一個標準。在存儲並保存爲UTC之前進行轉換。然後在顯示之前在所需的時區重新轉換它。如果你非常想保存本地時間,請將它保存爲mongo數據庫中的字符串,並將其轉換爲應用程序層的時間。 – 2016-02-25 11:01:33

+0

我按照你提到的方式去做。我只是認爲將日期存儲在本地時間中,並在單個日期字段中添加UTC偏移量(在iso8601之後),而不是將它們存儲在兩個單獨的字段中可能會更好。 – tomascharad 2016-02-25 13:35:22