如果`date`在月末,`date.setMonth`会导致月份设置得太高

IT技术 javascript date
2021-02-12 02:47:30

Date 对象的getMonth()方法似乎有一个错误。假设日期d2013-01-31,我尝试d像这样设置月份

const d = new Date(); // 2013-01-31

d.setMonth(8);
console.log(d.getMonth());

结果是9为什么?我在 Chrome 和 Firefox 中对此进行了测试。

我发现当它是一个月的 31 日、30 日或 29 日时,将日期设置为天数较少的月份会导致getMonth返回错误的值。

6个回答

让我们分解一下:

var d = new Date(); // date is now 2013-01-31
d.setMonth(1);      // date is now 2013-02-31, which is 3 days past 2013-02-28
x = d.getMonth();   // what to do, what to do, 3 days past 2013-02-28 is in March
                    // so, expect x to be March, which is 2

只有当 的天值d大于传递给 的月份中的最大天数时,才会出现此问题setMonth()否则,它会按您的预期工作。

d.getMonth()在这种情况下7按预期返回,因为八月(第 7 个月)有 31 天,就像一月一样(假设您打电话的日期new date()是 2013-01-31)。
2021-03-22 02:47:30
但是如果我将位置日期设置为今天,d.setMonth(8); d.getMonth()//8
2021-04-05 02:47:30
如果今天你的意思是 '2013-02-03' 或 '2012-02-04' 取决于你在世界上的哪个地方,那么这会正常工作。d将于 2013-02-03 开始​​。当您调用时d.setMonth(8)d将变为 2013-09-03。当您调用 时d.getMonth(),您应该期望返回 8。只有当传递到的月份setMonth()的天数少于当前月份并且当前日期大于新月份的最大天数时才会出现问题
2021-04-05 02:47:30
怎么样:var d = new Date(); d.setMonth(7); d.getMonth();//7 d.setMonth(8); d.getMonth();//9
2021-04-13 02:47:30

最简单的解决方案是向 setMonth 添加第二个参数:

var d = new Date();
d.setMonth(8,1);
d.getMonth(); //outputs 8

http://www.w3schools.com/jsref/jsref_setmonth.asp

Date.setMonth(月,日)

天:可选。表示月份中某天的整数 预期值为 1-31,但允许其他值:

0 将导致上个月的最后一天 -1 将导致上个月的最后一天的前一天 如果该月有 31 天:

32 将导致下个月的第一天 如果该月有 30 天:

32 将导致下个月的第二天

JavaScript 中的月份从 0 到 11 表示。第 1 个月将是只有 28/29 天的二月,因此当您将月份设置为 1 时,它会尝试将日期自动更正为三月以创建一个有意义的日期(自 2 月 31 日以来,没有意义)。使用 toDateString 函数试试看,看看我的意思:

 var d = new Date('2013/01/31');
 d.setMonth(2);
 console.log(d.toDateString()); // outputs Match 3rd, 2013

也许有点奇怪,但不是马车。

在javascript中,月份从0开始。假设今天是02/04/2012,当您setMonth(1)时,它会尝试设置为feb。由于 2 月的最大天数是 28/29,因此移至下个月(3 月,即 2)

这里的 setMonth 不是你所期望的,在更好的库中会发生什么。如果将日期 31.x.yyyy 设置为 x+1,则下个月 (x+1) 可能没有 31 天。所以31.x+1.yyyy会变成1.x+2.yyyy。

在这种情况下,月份将增加 2 - 日期完全改变。

我在更改二月->三月时遇到了这个问题,感谢上帝,这只是一个测试。