MongoDB 节点上的 ISODate 和时区 API

MongoDB ISODate and timezones on Node API

我使用 Node、IBM Strongloop 框架和 MongoDB 数据库构建了一个 API。 我对日期时区有疑问。 在前端,我有一个创建日期对象的反应日期选择器。

我在法国,所以 GMT+1。如果我在前端为 2000 年 1 月 6 日创建 出生日期,XHR 请求将发送 "2000-01-05T23:00:00.000Z" 到 API.

如果我在前端尝试 new Date('2000-01-05T23:00:00.000Z'),我会得到正确的日期 Thu Jan 06 2000 00:00:00 GMT +0100(中欧)

在 API 服务器上,时区 GMT+0,如果我检查数据库,我可以看到它是 ISODate("2000-01-05T 23:00:00Z")

如果我在服务器上尝试 new Date('2000-01-05T23:00:00Z'),我会得到错误的日期 Wed Jan 05 2000 23:00:00 GMT+ 0000(协调世界时)

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

正确的解决方法是什么?将日期作为字符串发送到服务器,不带时区,并让它在插入之前将它们构建为日期?或者还有其他方法吗?

像您现在这样以一致的方式 (GMT) 保存数据服务器端是最理想的。它应该留给客户端应用程序 send/display 基于其时区的正确偏移日期。

对于"date only"需要存储的数据,我认为更容易'将dateTime break只有年月日。您将此信息传输到您的服务器,并根据存储在服务器端的年月日创建一个新的 UTC DateTime 对象。或者干脆把这3个字段分开存放。

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

或者您可以创建一个新的 UTC 日期时间,前端日期正确,然后将其发送到后端,由您选择。

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

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

此外,对于 Javascript,我强烈建议使用一些外部 "proper" 框架来处理日期和时间,如果可以的话,比如 momentJS