Node.js-服务器的“ ISO”时间与Unix时间导致差异

时间:2018-09-22 12:52:31

标签: node.js timezone momentjs

过去,使用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,它是完全是< / strong>休息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

1 个答案:

答案 0 :(得分:0)

几件事:

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

  • 在所有情况下,您都在使用.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