不同格式的两个相同日期给出不同的纪元时间

时间:2019-04-12 09:46:55

标签: javascript date

以下语句:

(new Date("1993-09-01")).getTime() == (new Date(1993,9,1)).getTime()  

似乎在Node,Firefox和Chromium上都评估为false。为什么会这样?

2 个答案:

答案 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)

两件事:

  • 对于long constructor,月份从0开始。因此new Date(1993, 9, 1)不是9月,而是1993年10月1日 当地时间
  • 对于one argument constructor,当以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());