【问题标题】:Storing date and timezones in MongoDB在 MongoDB 中存储日期和时区
【发布时间】:2014-10-24 23:07:59
【问题描述】:

我只想得到专家的确认。 我仍然对我认为在这种环境中存储和处理日期的正确方法没有信心。

我正在开发一个小应用程序,仅供意大利用户使用

基本上,他们可以创建一个条目列表,每个条目都有一个creationDate(我只对日期部分感兴趣,时间在我的场景中没有用处)。

因此,用户在“日期”表单字段中输入以下格式的日期:22/06/2014 表示 2014 年 6 月 22 日。然后,日期被解析为:

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

最后,我的入口模型被添加到一个backbone.js 集合中,并通过Node.js + Express 存储在MongoDB 中的服务器端。

在 Mongo 中查询条目,我看到了:

2014-06-21 22:00:00 +0000

对应于“dateEntry”:日期(1403388000000)。

四处搜索,我发现 MongoDB 没有时区的概念。所有日期都以 UTC 格式存储,而我之前创建的日期对象为 GMT+2。 但我真的很害怕......我怎样才能以简单的方式找回我当地时区的日期?

接下来,我将在下划线模板中显示条目数据,这样:

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

还有……瞧!我得到了我当地的“意大利”日期:22/06/2014。

现在,我的问题是:这是正确的方法吗?

过程是:在本地时区解析日期 => 以 utc 存储 => 在本地时区检索日期。 这是一种常见的做法吗?

我还想:我不能简单地避免使用时区并将本地(意大利)时间存储为 UTC 时间(2014-06-22 00:00:00)吗? 有这么糟糕吗?

【问题讨论】:

  • 我将所有东西都设置为 UTC 从前到后(数据库、服务器、客户端通信等),时区在应用程序的最外边缘处理。我通常在 Rails 中工作,所以我不知道在 node.js 世界中通常是如何完成的。

标签: node.js mongodb date backbone.js momentjs


【解决方案1】:

是的,将所有时间戳存储在 UTC 中,然后将其转换为外层中的特定时区是一种常见的做法。很多框架会自动为你做这件事,包括 Rails。假设如果您今后也开始迎合其他时区,您将不会遇到任何问题,因为您的数据库有 UTC 条目。您将节省时区转换的开销。

如果您只想保存日期,您也可以这样做,但我认为您目前的操作方式没有任何害处 - 以 UTC 格式保存所有内容。我不确定node.js,但会有一些设置可以指定时区(意大利),所有的转换都会自动发生。您可能会发现此线程很有用:

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

【讨论】:

  • 这个问题是一些国家根据一年中的时间段使用不同的 UTC 偏移量。这使得有必要存储 UTC 偏移量,以便知道某个条目的实时时间。为此,Mongo 不仅可以存储“Z”,还可以存储本地时间戳,这将很有帮助。
  • 我不这么认为。 UTC 是一个标准。在存储并保存为 UTC 之前进行转换。然后在显示之前将其重新转换为您想要的时区。如果你非常想保存本地时间,把它作为字符串保存在 mongo db 中,然后在应用层转换为时间。
  • 我正在按照您提到的方式进行操作。我只是认为将日期存储在本地时间加上在单个日期字段中添加 UTC 偏移量(遵循 iso8601),而不是将它们存储在两个单独的字段中可能会更好。
猜你喜欢
  • 2016-11-18
  • 2015-02-13
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多