类似的日期格式会产生意外的日期Javascript

Log*_*phy 8 javascript format date

为什么第一个输入正常工作,但第二个输入在5小时前给出了结果?

new Date("2000-1-1")
Sat Jan 01 2000 00:00:00 GMT-0500 (EST)
new Date("2000-01-01")
Fri Dec 31 1999 19:00:00 GMT-0500 (EST)
Run Code Online (Sandbox Code Playgroud)

我如何让第二个与我合作?

var a = new Date("2000-1-1"); // Sat Jan 01 2000 00:00:00 GMT-0500 (EST)
var b = new Date("2000-01-01"); // Fri Dec 31 1999 19:00:00 GMT-0500 (EST)
console.log(a, a.getTime());
console.log(b, b.getTime());
Run Code Online (Sandbox Code Playgroud)

tal*_*myn 2

您看到这种情况的原因实际上在MDNDate.parse()页面上有所描述(其中描述了有关官方支持的参数格式的许多详细信息)。具体来说:Date

假定时区的差异

给定日期字符串“2014 年 3 月 7 日”,parse() 假定本地时区,但给定 ISO 格式(例如“2014-03-07”),它将假定 UTC 时区(ES5 和 ECMAScript 2015)。因此,使用这些字符串生成的 Date 对象可能表示不同的时刻,具体取决于支持的 ECMAScript 版本,除非系统设置为 UTC 本地时区。这意味着,看起来相等的两个日期字符串可能会产生两个不同的值,具体取决于要转换的字符串的格式。

所以你看到的是两件事的组合:

  1. 由于没有提供时区,构造函数正在将格式正确的 ISO 日期值读取为 UTC,并且
  2. 它准确识别您的本地计算机时区是美国东部时间,并适当调整该值。

因此,您将看到 UTC 时间 2000 年 1 月 1 日午夜(或 1999 年 12 月 31 日晚上 7 点)的美国东部时区版本。

由于您的第一个示例使用非标准格式(从 JS 的角度来看),因此第一个假设不会发挥作用,并且正在假设该值的本地时区(特定于浏览器的决定如何处理非标准格式)。