2014-08-31 170 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