首页 > 解决方案 > Node.js - 服务器“ISO”时间与 unix 时间导致差异

问题描述

过去,使用 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 TIME 的意外行为

但是......如果我要在服务器上计算 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.jstimezonemomentjs

解决方案


一些东西:

  • 在您描述的所有情况下,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

推荐阅读