【问题标题】:Momentjs Grabbing today's date and setting time causes it to fast-forward 24 hoursMomentjs 抓取今天的日期并设置时间使其快进 24 小时
【发布时间】:2013-10-20 19:34:18
【问题描述】:

我正在尝试根据用户偏好设置电子邮件超时。我早上的计算工作正常,但由于日期的行为与预期不符,所以永远不会发送晚上的电子邮件。

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

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 日进行。非常感谢您的帮助,或者如果这是一个错误,我很想知道我可以做些什么来解决这个问题,直到它得到解决。

【问题讨论】:

    标签: javascript node.js timezone momentjs


    【解决方案1】:

    无需计算machineTZdiffTZ 或添加任何分钟数。只需这样做:

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

    但请记住,420 等值不是时区,而是时区偏移量。它仅告诉您特定时间点的偏移量是多少。由于您是单方面应用它,因此在夏令时期间可能会得到不正确的结果。

    相反,您应该尝试使用moment-timezone 插件,然后执行以下操作:

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

    另请参阅timezone tag wiki,特别是标题为“时区!= 偏移量”和“IANA/Olson 时区数据库”的部分。

    【讨论】:

    • 我昨天刚刚找到了时刻时区,在我解决了这个问题之后打算试一试。试一试您的建议,如果可行,会通知您:)。
    • 终于通关了!谢谢你:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多