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。
我使用 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。