【问题标题】:Node.js - server "ISO" time vs unix time causes differenceNode.js - 服务器“ISO”时间与 unix 时间导致差异
【发布时间】:2018-09-22 12:52:30
【问题描述】:

过去,使用 unix 时间(根据定义是从 UTC 的角度来看)在解析和/或转换服务器之间的时间时从未造成差异。但是,我遇到了相当意外的行为,我似乎无法终生调试。

这实际上是在两台服务器上生产和预期的

let present = moment('2018.09.20', 'YYYY.MM.DD').tz('America/Toronto').toISOString()

--> '2018-09-20T04:00:00.000Z'

let utc_present = moment('2018.09.20', 'YYYY.MM.DD').tz('UTC').toISOString() --> '2018-09-20T04:00:00.000Z'

UNIX 时间的意外行为

但是...如果我要在服务器上计算 unix 时间,使用完全相同的日期输入,我得到 1537401600000 而不是预期的 1537416000000,这是 完全 4休息时间。我想服务器时间可能会出现问题,但我的印象是显式转换为 unix 可以解决这个问题。

打印下面的 unix 等效项以供参考,取自其中一个服务器。

let unix_present = moment('2018.09.20', 'YYYY.MM.DD').tz('America/Toronto').unix()*1000

--> 1537416000000

let unix_present = moment('2018.09.20', 'YYYY.MM.DD').tz('UTC').unix()*1000

--> 1537416000000

【问题讨论】:

    标签: node.js timezone momentjs


    【解决方案1】:

    一些事情:

    • 在您描述的所有情况下,moment('2018.09.20', 'YYYY.MM.DD') 将日期解析为您本地时区的午夜。因此,根据您在哪个时区运行代码,您将获得不同的结果。

    • 在所有情况下,您都使用.tz('some zone'),这是为了转换到特定区域。由于您随后要求提供 Unix 时间(如您所说的 UTC),因此时区转换对输出没有影响。

    • 您无需执行.unix()*1000,您只需执行.valueOf() - 因为内部已经跟踪毫秒。

    如果您指的是多伦多当天的午夜,那么:

    moment.tz('2018.09.20', 'YYYY.MM.DD', 'America/Toronto').valueOf() //=> 1537416000000
    

    如果您指的是 UTC 日期的午夜,那么您不需要时刻时区,只需:

    moment.utc('2018.09.20', 'YYYY.MM.DD').valueOf()  //=> 1537401600000
    

    【讨论】:

    • 这是关键:“moment('2018.09.20', 'YYYY.MM.DD') 将日期解析为您当地时区的午夜......” - 谢谢!我原以为将其排除在外将默认为 UTC,类似于new Date()。我将发送 PR 以将其添加到文档中。
    • 它在文档中。在顶部的“指南”部分中还有一个关于解析的部分。
    • 我在解析部分添加了一个注释,因为现有的提及更进一步。此外,在服务器上尝试过此操作后,显式传入'America/Toronto' 仍会导致上述意外行为。但是,一旦我明确地setDefault,它确实有效。
    猜你喜欢
    • 2010-10-11
    • 2018-07-20
    • 1970-01-01
    • 2016-05-12
    • 2013-02-20
    • 2013-03-09
    • 2014-04-11
    • 2013-03-11
    • 2020-09-02
    相关资源
    最近更新 更多