我正在尝试将开始和结束时间(如进入和退出时间逻辑)从 Node js插入Mongodb。 我的本地系统的时区是 IST。客户端和服务器的偏移量为+5:30。
现在请按照这个示例进行操作。
entryDate: 15-10-2018,
start: 15-10-2018 01:00:00,
end: 15-10-2018 05:00:00
现在,由于我在客户端和服务器上处于同一时区,因此它不会更改我的日期值并创建新对象。
然后我将这些数据存储到 MongoDB 中。如您所知,mongo db 会将日期转换为 UTC,然后存储它。所以在我的数据库中它看起来像这样。
entryDate: ISODate("2018-10-15T00:00:00Z"),
start: ISODate("2018-10-14T19:30:26Z"),
end: ISODate("2018-10-14T23:30:26Z")
现在,如果我想搜索一个查询,该查询应该为我提供 15 到 16 之间的日期和时间记录,那么我将不会获得任何数据。
现在考虑这个例子。我将应用程序移至服务器上。现在服务器时区采用 UTC。因此,我传递的每个日期都将直接转换为 UTC,因此它将像以前一样插入相同的数据。
现在的区别是,当我想搜索 IST 时区的日期范围时,它会给我精确的搜索日期,例如 (15-10-2018 00:00:00) 到 (16-10-2018 00:00) :00)。
在服务器上,它会将此日期转换为 UTC,并且可以给我少一天或可能更长的时间,例如 (14-10-2018 18:30:00) 到 (15-10-2018 18:30:00) )。所以从一开始我的查询就是错误的。
那么如何解决这个问题呢?谢谢。
最佳答案
经过一些研究。我有一个解决方案。
- 在客户端获取您的日期。
- 将该日期转换为 UTC 日期并将日期字符串传递到服务器。比如 2018 年 1 月 1 日 10:00:00。 (注意:我们只是转换日期,而不是时区)
- 在服务器端根据提供的日期创建一个日期对象,默认情况下会将日期转换为 UTC 时间。
- 使用 MongoDB 将日期存储在服务器端。由于日期采用 UTC 格式,因此不会再次转换日期并按原样存储。
- 现在,您将从服务器获取 UTC 格式的日期,例如“2018-01-01 10:00:00”。
- 现在在客户端,从此日期创建一个日期对象。这会将您的日期转换为您通过的实际日期。
这解决了我的问题。
关于javascript - 如何解决Node js和mongodb中的时区问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52813922/