过去,使用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
答案 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