今天遇到了一个JS时间函数的BUG。
姑且可以认为是BUG吧,我觉得。
var ed='2015-03-31';
var minDate = new Date(ed.replace(/\-/g,"/"));
minDate.setMonth(minDate.getMonth() - 1);
很明显,我期待的数据是2018-02-28
但是实际上minData的时间是:Tue Mar 03 2015 00:00:00 GMT+0800
2015-03-03
这是为啥子咧??
我猜时间函数加减月份的内部规则其实是,3月往前一个月是2月,2月是28天,所以2月加28天是一个月后的3月的日期。同理反之3月减28天得到的是2月的日期。
然后问题来了,3月31日减去28天,是3月3日。
同理,5月31日的一个月以前结果是5月1日,而不是4月30日。
看来,月底这一天很可能出问题哎。
——分割线——
仔细想了下,其实也不是bug。
因为没有读源码,推测实际情况应该是这样。
setmonth时首先定位到2月1日的时间点,然后往后计算31天。这样才会出现本想定位到2月最后一天结果定位到了3月3日。