5

为什么这两个日期不同

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);

结果 :

Date 1 : Sat Dec 01 2012 14:56:16 GMT+0100
Date 2 : Thu Nov 01 2012 00:00:00 GMT+0100

而这两个日期相等

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);

结果 :

Date 3 : Mon Oct 01 2012 14:56:16 GMT+0200
Date 4 : Mon Oct 01 2012 00:00:00 GMT+0200

另一个问题是为什么 dodate1.setMonth(10)给出了 12 月的日期(应该是 11 月)。

4

3 回答 3

10

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

然后,当您尝试将月份设置为 11 月时,该怎么办?11 月只有 30 天……所以将它包裹到 12 月。

如果您更改顺序以便在月份之前设置日期,则它可以工作:

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)

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

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

文档不是清楚,但至少具有启发性:

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

(“因此”远非精确,但这意味着实施至少可以说是正确的......)

于 2012-10-31T14:16:43.860 回答
3

setMonth接受第二个参数:

如果不指定 dayValue 参数,则使用从 getDate 方法返回的值。

当您将月份设置为10(11 月)时,它会获取当前日期值 ( 31) 并将其设置为日期。由于 11 月只有 30 天,因此会将您滚动到 12 月 1 日。

于 2012-10-31T14:17:29.163 回答
0

您正在创建一个包含当前日期 ( new Date()) 的 var,然后您正在更改其中的一些键(年、月和日)。

另一方面new Date(2012, 10, 1, 0, 0, 0, 0)意味着“创建一个具有这些确切值的日期对象”。

这就是为什么您的日期对象不相等的原因。

于 2012-10-31T14:12:22.443 回答