2014-12-19 17 views
0

我正在使用Intranet Web应用程序。该应用程序用于美国,欧洲和亚洲。在Mongo和Nodejs的网络应用程序中处理日期的日期

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

new Date().toISOString(); 

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

存储工作正常。

但是我接下来假设在拍摄时间前一小时向欧洲和亚洲的用户发送电子邮件提醒。

我完全困惑这应该如何执行。

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

为此写了什么样的查询?

+0

您可以使用'new Date()'创建Date对象,并使用UTC方法获取当前UTC时间。然后构造一个查询以从数据库中获取适当的条目。那么这是一个JavaScript或SQL的问题? – RobG 2014-12-19 07:30:50

+0

你如何在MongoDB中存储日期?我担心你将它们作为字符串存储,因为你正在使用'.toISOString()'。将日期存储为日期时间。要在您的应用程序中处理时间,只需使用UTC。当你得到时间时,转换为UTC。当你显示当地时间时,从UTC转换。在您的应用程序和数据库中,只需使用UTC即可 - 应该尽量减少混淆。 – wdberkeley 2014-12-19 16:16:21

回答

0

我不知道如何编写MongoDB的实际查询,但也许这会有所帮助。

,你可以:

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

This post展示了如何使用moment.js和时区组件

+0

OP的所有时间存储为UTC,在服务器上获取当前UTC时间是微不足道的,根本没有要求考虑时区。问题更多的是如何格式化查询。 – RobG 2014-12-19 07:31:31

+0

啊,我明白了。我把它看作更多的逻辑问题。我的错。 – DelightedD0D 2014-12-19 07:40:20

0

不知道到底是什么你求,但两个选项。

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

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

或者查看this aggregation,将日期缩减为组件。请注意,$ 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" }, 
     } 
    } 
    ] 
)