以下语句:
(new Date("1993-09-01")).getTime() == (new Date(1993,9,1)).getTime()
似乎在Node,Firefox和Chromium上都评估为false。为什么会这样?
答案 0 :(得分:2)
这是因为JavaScript日期对象中月份的索引从0开始(即1月为0,2月为1,依此类推)。
对于右边的语句,如果我尝试进行console.log(,则新的Date(1993,9,1)将导致'Fri Oct 01 1993 00:00:00 GMT + 0800(Singapore Standard Time)'。 )。
尝试运行以下代码段:
const date1 = new Date(1993,9,1);
const date2 = new Date('1993-09-01');
console.log(date1);
console.log(date2);
根据JavaScript Date object documentation,有多种实例化Date对象的方法。关于您的问题,您已经使用了文档中提到的两种格式:
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)
。
即使如此,在进行了上述更改之后,以下代码段也将显示为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)
等同于编写{{1} }
答案 1 :(得分:1)
两件事:
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());