为什么用javascript设置月份会出错?

时间:2018-08-31 02:33:59

标签: javascript

设置月份时我发现了它

  1. 今天是08-31
  2. 如果我增加一个月,那么今天将是09-30
  3. 但是它返回10-01
  4. 如果我减少月份,则返回09-01

date = new Date()
console.log( date )
// Fri Aug 31 2018 11: 28: 47 GMT + 0900(한국 표준시)

console.log( date.getMonth() ) 
// 7

console.log( date.setMonth(date.getMonth() + 1) )
// 1538360927857

console.log( date.toISOString() )
// "2018-10-01T02:28:47.857Z"

console.log( date.setMonth(date.getMonth() - 1) )
//1535768927857

console.log( date.toISOString() )
//"2018-09-01T02:28:47.857Z"

有人能解释我为什么会发生吗?

3 个答案:

答案 0 :(得分:4)

当当前日期为08-31时,由于9是无效日期,因此尚不清楚将月份设置为09-31的含义。 这就是为什么有时必须定义setMonth在这种情况下应该做什么的原因。似乎定义的行为与您期望的行为不同(您期望日期变为09-30)。

MDN(对于setMonth)具有有关此信息:

  

该月的当前日期将影响此方法的行为。 从概念上讲,它将把当月的当前日期给定的天数添加到指定的新月的第一天作为参数,以返回新的日期。

它也指actual specification,它给出用于计算结果的确切算法。 规范之所以存在的原因是多方面的,通常算法的简单性以及非边缘情况下的行为都是重要因素。

答案 1 :(得分:2)

可以在MDN

上找到很好的解释
  

该月的当前日期将影响此方法的行为。从概念上讲,它将把当月的当前日期给定的天数与指定为参数的新月的第一天相加,以返回新的日期。例如,如果当前值为2016年8月31日,则调用setMonth值为1将返回2016年3月2日。这是因为在2016年2月有29天。

在您的情况下,setMonth(getMonth()+ 1)将返回10月1日,因为9月只有30天。然后,当您尝试将月份减少到一个月时,您可以回到9月1日。

答案 2 :(得分:1)

JavaScript Date对象-monthIndex基于零(0),就像数组(零索引)一样。

MDN