在 Mongo 和 Nodejs 的 Web 应用程序中处理跨时区的日期

Handling date across timezones in web-application in Mongo and Nodejs

本文关键字:处理 时区 日期 Web Mongo Nodejs 应用程序      更新时间:2023-09-26

我正在开发一个内联网Web应用程序。此应用程序在美国,欧洲和亚洲使用。

从用户浏览器中的日期选择器小部件中,我捕获日期,然后将其传递给在美国服务器上运行的应用程序。

new Date().toISOString();

我正在使用JavaScript日期对象并将日期转换为UTC格式,然后将其传递给服务器以存储在Mongo DB中。

存储工作正常。

但是,我接下来应该在捕获时间前一小时向欧洲和亚洲的用户发送电子邮件提醒。

我对应该如何执行此操作感到完全困惑。

Mongo 中的日期采用 UTC 格式。如何从数据库中检索所有文档,使它们的时间接近一小时(以便我可以发出一个事件,该事件将触发提醒电子邮件(。

为此编写什么样的查询?

我不知道

如何为 Mongo DB 编写实际的查询,但也许这会有所帮助。

您可以:

  • 使用 CRON 作业每小时运行一次查询。
  • 当查询运行时,获取今天需要提醒的所有对象。
  • 对象中需要存储用户的时区。
  • 使用Moment.js它的时区组件将捕获的时间转换为用户的时区。
  • 如果捕获的时间在下一小时内,请发送电子邮件。

这篇文章展示了如何使用moment.js和时区组件

不确定你到底在寻求什么,但有两个选择。

您可以按照建议在 crontab 的基础上使用> &&<= 进行检索。

var now =  ISODate("2014-01-16T01:00:00.000Z");
var houragp = now - 1hr
db.collection.find({ "yourdate" : { $gt : hourago , $lte : now }  })

或者,查看此聚合,它将日期缩减为组件。请注意,键$yourdate的美元符号是一个聚合习惯用法。

db.sales.aggregate(
   [
     {
       $project:
         {
           year: { $year: "$yourdate" },
           month: { $month: "$yourdate" },
           day: { $dayOfMonth: "$yourdate" },
           hour: { $hour: "$yourdate" },
           minutes: { $minute: "$yourdate" },
           seconds: { $second: "$yourdate" },
           milliseconds: { $millisecond: "$yourdate" },
           dayOfYear: { $dayOfYear: "$yourdate" },
           dayOfWeek: { $dayOfWeek: "$yourdate" }
         }
     }
   ]
)

您的情况可能只需要。

db.sales.aggregate(
   [
     {
       $project:
         {
           hour: { $hour: "$yourdate" },
         }
     }
   ]
)