我正在尝试根据用户首选项使电子邮件超时。我的早晨计算工作正常,但晚上的电子邮件永远不会发送,因为日期的行为不符合预期。
首先,这是我用来抓住时间并根据用户位置等进行调整的代码。
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);
我每小时都会检查一次,看看是否是时候安排另一封电子邮件发出了。现在这是硬编码的,但是当我开始添加用户首选项时,他们将能够选择他们想要的本地时间。
我一直在调试我的值以进行故障排除。下面是清晨运行的作业的输出(从服务器的角度来看):
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?
突然之间,我对晚上的计算翻转了日期变更线,尽管它仍然是 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 进行。非常感谢帮助,或者如果这是一个错误,我很想知道我可以做些什么来解决这个问题,直到它得到解决。
无需计算machineTZ
、diffTZ
或添加任何分钟。 只需执行此操作:
moment().zone(userTZ).startOf('day').hour(7).minute(0)
但请记住,420
等值不是时区,而是时区偏移量。 它只告诉您特定时间点的偏移量是多少。 由于您是单方面应用的,因此在夏令时可能会得到不正确的结果。
相反,您应该尝试使用时刻时区插件,并执行类似操作:
moment().tz("America/Los_Angeles").startOf('day').hour(7).minute(0)
另请参阅时区标签维基,特别是标题为"时区!=偏移量"和"IANA/奥尔森时区数据库"的部分。