【发布时间】:2019-04-12 09:46:54
【问题描述】:
以下声明:
(new Date("1993-09-01")).getTime() == (new Date(1993,9,1)).getTime()
似乎在 Node、Firefox 和 Chromium 上都评估为 false。为什么会这样?
【问题讨论】:
标签: javascript date
以下声明:
(new Date("1993-09-01")).getTime() == (new Date(1993,9,1)).getTime()
似乎在 Node、Firefox 和 Chromium 上都评估为 false。为什么会这样?
【问题讨论】:
标签: javascript date
这是因为 JavaScript Date 对象中月份的索引从 0 开始(即一月为 0,二月为 1,以此类推)。
对于右侧的语句,如果我尝试使用 console.log( ) 它。
尝试运行以下代码 sn-p:
const date1 = new Date(1993,9,1);
const date2 = new Date('1993-09-01');
console.log(date1);
console.log(date2);
根据JavaScript Date object documentation,实例化日期对象有多种方式。关于您的问题,您已经使用了文档中提到的两种格式:
1) new Date(dateString)
dateString 的一些可接受的格式包括“1995 年 12 月 17 日 03:24:00”、“1995-12-17T03:24:00”和“1993-09-01”。
2)new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
请注意,对于第二个参数monthIndex,文档说明月份是从 0 开始的,这意味着我们必须从 0 开始计数。
注意:参数 monthIndex 是从 0 开始的。这意味着一月 = 0,十二月 = 11。
因此,new Date(1993, 9, 1) 表示 1993 年 10 月 1 日。您应该改用 new Date(1993, 8, 1)。
即便如此,在进行上述更改后,下面的 sn-p 仍会打印为 false。为什么会这样?
console.log((new Date('1993-09-01')).getTime() === (new Date(1993,8,1)).getTime())
再一次,我们在documentation 中引用此部分:
如果提供了至少两个参数,则缺少的参数是 设置为 1(如果缺少这一天)或为所有其他设置为 0。
这意味着在new Date(1993,8,1)的情况下,剩余的可选参数(小时、分钟、秒和毫秒)被设置为0。因此,new Date(1993,8,1)相当于写new Date(1993,8,1,0,0,0,0)
【讨论】:
两件事:
new Date(1993, 9, 1) 不是 9 月,而是 1993 年 10 月 1 日当地时间
yyyy-mm-dd 格式传递时,引擎可以假定时区是UTC 或本地,具体取决于规格跟随(ref)。因此,如果引擎遵循 ES5 规范,new Date("1993-09-01").getTime() == new Date(1993, 8, 1) 仍可能返回 false:var d1 = new Date("1993-09-01");
var d2 = new Date(1993, 8, 1);
console.log(d1.toISOString());
console.log(d2.toISOString());
【讨论】: