Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点8和节点10中创建新日期时出现不一致_Javascript_Date - Fatal编程技术网

Javascript 在节点8和节点10中创建新日期时出现不一致

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–从时间中减去一个小时,导致它回滚到上一年。但是,如果我运行新日

(是的,这些都是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
–从时间中减去一个小时,导致它回滚到上一年。但是,如果我运行新日期('1972-01-01 00:00:00'),我将返回
1972-01-01T00:00:00.000Z
,而不会回滚到上一年

现在是英国的英国夏令时,我最初认为这可以解释这个问题,但我希望它发生在所有创建的日期,而不仅仅是1970年(和1971年)


有什么想法吗?

节点尝试在第一次使用日期时获取本地时区。因此,日期的解析可能会有所不同。看

如果希望节点假定您提交的每个日期都是UTC日期,请尝试以下操作之一:

  • 按照建议使用
  • 仅使用日期:
    新日期(“yyyy-mm-dd”)
  • 设置
    process.env.TZ=“UTC”在访问任何日期()函数之前
例1:

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的格式。