Javascript 在节点8和节点10中创建新日期时出现不一致
(是的,这些都是Node的旧版本,我正在更新一个旧的代码库,我很好奇发生这种情况的原因) 如果我正在使用节点8并运行Javascript 在节点8和节点10中创建新日期时出现不一致,javascript,date,Javascript,Date,(是的,这些都是Node的旧版本,我正在更新一个旧的代码库,我很好奇发生这种情况的原因) 如果我正在使用节点8并运行newdate('1970-01-01 00:00:00'),则会将此日期返回给我。如果我运行新日期('1972-01-01 00:00:00'),我会将该日期返回给我 但是,如果我升级到节点10并运行newdate('1970-01-01 00:00:00'),我会得到1969-12-31T23:00:00.000Z–从时间中减去一个小时,导致它回滚到上一年。但是,如果我运行新日
newdate('1970-01-01 00:00:00')
,则会将此日期返回给我。如果我运行新日期('1972-01-01 00:00:00')
,我会将该日期返回给我
但是,如果我升级到节点10并运行newdate('1970-01-01 00:00:00')
,我会得到1969-12-31T23:00:00.000Z
–从时间中减去一个小时,导致它回滚到上一年。但是,如果我运行新日期('1972-01-01 00:00:00'),我将返回1972-01-01T00:00:00.000Z
,而不会回滚到上一年
现在是英国的英国夏令时,我最初认为这可以解释这个问题,但我希望它发生在所有创建的日期,而不仅仅是1970年(和1971年)
有什么想法吗?节点尝试在第一次使用日期时获取本地时区。因此,日期的解析可能会有所不同。看 如果希望节点假定您提交的每个日期都是UTC日期,请尝试以下操作之一:
- 按照建议使用
- 仅使用日期:
新日期(“yyyy-mm-dd”)
- 设置
process.env.TZ=“UTC”代码>在访问任何日期()函数之前
process.env.TZ = "GMT"; // or GMT+0 or UTC
console.log(Date.parse("1970-01-01")); // 0
console.log(Date.parse("1970-01-01 00:00:00")); // 0
例2:
process.env.TZ = "GMT+1"; // or Europe/London
console.log(Date.parse("1970-01-01")); // 0
console.log(Date.parse("1970-01-01 00:00:00")); // -3600000
例3:
process.env.TZ = "Europe/Berlin"; // or GMT+1
console.log(Date.parse("1970-01-01")); // 0
console.log(Date.parse("1970-01-01 00:00:00")); // -3600000
您需要一个有效的ISO日期->
新日期(“1970-01-01T00:00:00.000Z”)
,否则Javascript会将此视为区域设置时间。@Keith-ECMA-262是定义内置解析器行为的标准1970-01-01 00:00:00'是一个有效的ISO 8601时间戳,如果交换它的各方同意用空格()替换“T”。@RobG老实说,我以为node会在没有“T”的情况下解析并作为ISO解析,但它没有。OP特别询问了node。另一方面,例如Chrome似乎确实将此视为ISO日期。故事的士气,只要坚持一个完全合格的ISO字符串,你就可以走了。@RobG@Christopher。ECMA-262引用了ISO 8601,但该声明不是规范性的,因此“……基于……的简化”。此外,您正在引用10年前的ECMA-262 Ed 5.1。最新发布的版本位于,但该声明没有更改。:-)关键是有许多ISO 8601格式,ECMA-262是ECMAScript的规范性参考,定义了仅支持一种符合ISO 8601的格式。