如何解决Node js和mongodb中的时区问题?

时间:2018-10-15 09:45:29

标签: javascript node.js mongodb momentjs

我正在尝试将开始和结束时间(如进入和退出时间逻辑)从节点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 )。所以从一开始我的查询是错误的。

那么如何解决这个问题?谢谢。

1 个答案:

答案 0 :(得分:0)

经过一些研究。我有解决办法。

  1. 在客户端获取日期。
  2. 将该日期转换为UTC日期,并将日期字符串传递给服务器。像01-01-2018 10:00:00。 (注意:我们只是在转换日期,而不是时区)
  3. 在服务器端,从提供的日期创建日期对象,该对象将默认在同一时间将日期转换为UTC。
  4. 使用MongoDB将日期存储在服务器端。由于日期采用UTC,因此不会再次转换日期并将其原样存储。
  5. 现在从服务器上,您将获得UTC格式的日期,类似于“ 2018-01-01 10:00:00”。
  6. 现在在客户端,从该日期创建一个日期对象。这会将您的日期转换成您通过的实际日期。

这解决了我的问题。