Momentjs抓住今天的date和设置时间使它快速前进24小时

我正在尝试根据用户的喜好超时发送电子邮件。 我的早晨计算工作正常,但是晚上的电子邮件永远不会发送,因为date并不像预期的那样行事。

首先,这里是我用来获取时间和根据用户位置进行调整的代码。

var time = moment(); var machineTZ = time.zone(); var userTZ = 420; var diffTZ = userTZ - machineTZ; var oneHour = moment(time).add('minutes', 60); var morningRun = moment().startOf('day'); morningRun.hour(7).minute(0); morningRun.add('minutes', diffTZ); var eveningRun = moment().startOf('day'); eveningRun.hour(19).minute(30); eveningRun.add('minutes', diffTZ); 

我正在检查每个小时,看是否该安排另一封电子邮件出去。 现在这是硬编码的,但是当我开始添加用户偏好时,他们将能够select他们想要外出的当地时间。

我一直在debugging我的值来排除故障。 这是从凌晨(从服务器的angular度)运行的作业的输出:

 lastRun: 2013-10-12T00:06:55.088Z (this one is being run at 1 am) morningRun: 2013-10-11T14:00:00.000Z eveningRun: 2013-10-12T02:30:00.000Z 

运行数字是我所期望的那样。 在两个小时的时间里,我想晚上的电子邮件出去(我的时间是下午7:30 =第二天上午2:30服务器时间)。

再看一个小时后我们看到:

 lastRun: 2013-10-12T01:06:58.267Z (this one is at 2 am) morningRun: 2013-10-12T14:00:00.000Z eveningRun: 2013-10-13T02:30:00.000Z <---- what? 

突然之间,我的晚上计算已经翻过date,尽pipe现在仍然是10/12(不是10/13)。 正因为如此,我检查是否应该安排电子邮件失败,因为它现在认为我需要在24小时内发送电子邮件,而不是30分钟。

一直在与这种奇怪的不一致的争斗,我想我已经找出了为什么这样做,并调整了我的计算使用上面的时区的东西,但没有做的把戏:(这当然似乎有点怪异错误,因为我预计会发生这种情况:

 //Today is 10/12 var eveningRun = moment().startOf('day'); //10/12/2013 - 00:00:00 eveningRun.hour(19).minute(30); //10/12/2013 - 19:30 eveningRun.add('minutes', diffTZ); //10/13/2013 - 2:30 am 

这个工作一直到某个时候,它决定“今天”实际上是10/13,而晚间运行是在10/14发生。 非常感谢帮助,或者如果这是一个错误,想知道我可以做些什么来解决这个问题,直到它解决。

没有必要计算diffTZdiffTZ或添加任何分钟。 只要做到这一点:

 moment().zone(userTZ).startOf('day').hour(7).minute(0) 

但请记住,如420这样的值不是时区,而是时区偏移量 。 它只会告诉你什么是一个特定的时间点的抵消。 由于您正在单方面应用,所以在夏令时期间可能会得到不正确的结果。

相反,你应该尝试使用时区时区插件,而不是做这样的事情:

 moment().tz("America/Los_Angeles").startOf('day').hour(7).minute(0) 

另请参阅时区标记wiki ,特别是标题为“时区!=偏移”和“IANA /奥尔森时区数据库”的部分。