作者:堅(jiān)強(qiáng)一點(diǎn)
鏈接:https://zhuanlan.zhihu.com/p/22253858
來源:知乎
著作權(quán)歸作者所有袍睡。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處崔泵。
在寫js 日歷插件的時(shí)候遇到一個(gè)奇怪的情況彩扔。
日歷當(dāng)前的日期是 2016-08-31 號(hào) 用? js Date 類型保存的當(dāng)前日期
var currDate = new Date(); // 初始化的時(shí)候的當(dāng)期日期称诗,
當(dāng)我點(diǎn)擊下一個(gè)月的時(shí)候娇跟,直接取出當(dāng)期日期的月份岩齿,然后 +1
直接重置 currDate 的月份 的代碼ru
currDate.setMonth(currDate.getMonth() + 1);
在大部分情況下這種做法是沒有問題的。
但是如果當(dāng)前月份是 2016-08-31 的時(shí)候苞俘,我取出當(dāng)期月份然后+1最后的結(jié)果是2016-10-01
月份增加了2月盹沈,而不是想象中的只增加了一個(gè)月,如果細(xì)心的人已經(jīng)發(fā)現(xiàn)了吃谣,日期的天數(shù)變化乞封,從31號(hào)變到了1號(hào)做裙,其實(shí)問題也就出現(xiàn)在這里。
因?yàn)楫?dāng)我使用“currDate.setMonth(currDate.getMonth() + 1);”這段代碼重置月份的時(shí)候肃晚,
最后的結(jié)果是 2016-09-31锚贱,但是實(shí)際情況是,2016-09月份的時(shí)候只要30填关串,沒有31號(hào)惋鸥,所以日期就自動(dòng)往后延期了一天變成了2016-10-01
所以最后我把重置的代碼改成了如下
currDate.setMonth(currDate.getMonth() + 1);
currDate.setDate(1);
手動(dòng)吧日期放到了第一天,心想這下應(yīng)該沒問題了悍缠。結(jié)果實(shí)際情況一點(diǎn)都沒變。還是從2016-08-31 直接跳到了2016-10-01耐量。
其實(shí)問題還是一樣的情況飞蚓,因?yàn)樵趫?zhí)行 currDate.setMonth(currDate.getMonth() + 1); 這段代碼的時(shí)候? currDate 已經(jīng)是? 2016-10-01 號(hào)了,這個(gè)時(shí)候在執(zhí)行
currDate.setDate(1);這段代碼的時(shí)候 只是吧 當(dāng)前月份的日期重置到了1號(hào)廊蜒,所以沒有任何變化趴拧。
最后把代碼改成了
currDate.setDate(1);
currDate.setMonth(currDate.getMonth() + 1);
解決問題。