Node API上的MongoDB ISODate和时区

时间:2017-11-27 11:17:12

标签: node.js mongodb date datetime strongloop

我使用Node构建了一个API,其中包含IBM Strongloop框架以及MongoDB数据库。 我有日期时区的问题。 在前端,我有一个创建日期对象的反应日期选择器。

我在法国,所以 GMT + 1 。如果我在前端创建2000年1月6日的出生日期,则XHR请求会向API发送“2000-01-05T23:00:00.000Z”

如果我在前端尝试新日期('2000-01-05T23:00:00.000Z'),我会得到正确的日期 Thu Jan 06 2000 00:00:00 GMT + 0100(CET)< /强>

在时间区 GMT + 0 的API服务器上,如果我检查数据库,我可以将其视为ISODate(“2000-01-05T23:00:00Z”)

如果我在服务器上尝试新日期('2000-01-05T23:00:00Z'),我的错误日期 Wed Jan 05 2000 23:00:00 GMT + 0000(UTC)

当然,我的用户可以拥有不同的时区,因此将服务器时区设置为GMT + 1将无法解决问题。

什么是正确的解决方案?将日期作为字符串发送到服务器,没有时区,并在插入之前将它们构建为日期?或者还有另一种方式吗?

2 个答案:

答案 0 :(得分:0)

理想的是以一致的方式(GMT)保存数据服务器端,就像您现在所做的那样。它应该留给客户端应用程序根据其时区发送/显示正确的偏移日期。

答案 1 :(得分:0)

对于需要存储的“仅限日期”数据,我认为更容易'将日期时间分解为仅年,月和日。您将此信息传输到服务器,并根据存储在服务器端的年,月和日期创建新的UTC DateTime对象。或者只是分别存储3个字段。

要获取此信息,您可以使用getUTCxxx()(xxx为日,月或年)Javascript方法。

或者您可以使用正确的日期前端创建新的UTC日期时间,并将其发送给您的选择后端。

如果您这样做,您将在后端存储正确的日期(例如,如果它是在UTC午夜的正确日期)。

然后,当您查询前端显示的值时,您可以强制仅考虑日期时间数据的(UTC)日期部分,即正确的年,月和日。

另外,对于Javascript,我强烈建议使用一些外部的“正确”框架来处理日期和时间,如果可以,请使用momentJS