Javascript中两个日期初始化的差异

Jea*_*les 5 javascript datetime date

为什么这两个日期不同:

var date1 = new Date();
date1.setFullYear(2012); // year (four digits)
date1.setMonth(10); // month (from 0-11)
date1.setDate(1); // day of the month (from 1-31)

var date2 = new Date(2012, 10, 1, 0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

结果:

Date 1 : Sat Dec 01 2012 14:56:16 GMT+0100
Date 2 : Thu Nov 01 2012 00:00:00 GMT+0100
Run Code Online (Sandbox Code Playgroud)

而这两个日期是等于:

var date3 = new Date();
date3.setFullYear(2012); // year (four digits)
date3.setMonth(9); // month (from 0-11)
date3.setDate(1); // day of the month (from 1-31)

var date4 = new Date(2012, 9, 1, 0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

结果:

Date 3 : Mon Oct 01 2012 14:56:16 GMT+0200
Date 4 : Mon Oct 01 2012 00:00:00 GMT+0200
Run Code Online (Sandbox Code Playgroud)

另一个问题是为什么要date1.setMonth(10)在12月给出一个日期(应该是11月).

Jon*_*eet 10

终于明白了.new Date()将日期设置为当前日期和时间.换句话说,10月31日(撰写本文时).

当您尝试将月份设置为11月时,该怎么办?十一月只有30天......所以它将它包裹到十二月.

如果您更改订单以便设置月份之前的日期,则可以:

var date1 = new Date();
date1.setFullYear(2012); // year (four digits)
date1.setDate(1); // day of the month (from 1-31)
date1.setMonth(10); // month (from 0-11)
Run Code Online (Sandbox Code Playgroud)

或者如jbabey的回答所暗示的那样:

var date1 = new Date();
date1.setFullYear(2012); // year (four digits)
date1.setMonth(10, 1); // month (from 0-11) and day (1-31)
Run Code Online (Sandbox Code Playgroud)

文档并不十分清楚,但它至少是暗示性的:

如果指定的参数超出预期范围,则setMonth会尝试相应地更新Date对象中的日期信息.例如,如果对monthValue使用15,则年份将增加1(年+ 1),3将用于月份.

("相应"远非精确,但这意味着实施至少可以证明是正确的......)