node.js - 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
解决方案
一些东西:
在您描述的所有情况下,
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
推荐阅读
- r - 在 R 中,将相同 ID 的多个逻辑行折叠成 1 行
- sql - 如何编写给出两个表差异的程序?
- node.js - 打字稿:任何人都有一种优雅的方式来接收具有已知时区的日期字符串并将其转换为 UTC
- wordpress - WordPress.org 添加低级代码/添加外部 API?
- c++ - C++:constexpr 对变量暗示隐式 const 不适用于引用
- python - 关系字段Many2one和One2many中的AttributeError
- google-apps-script - 在谷歌应用脚本中的特定行之间添加行
- django - Django,模板。无法在 if 语句中传递变量
- javascript - 我在哪里为我的网站上传套接字 io 服务器 javascript 文件?
- ssh - 将 SSH 端口 22 更改为 800