解析JS在獲取當(dāng)前月的最后一天遇到的坑
為了更好的講這節(jié)的內(nèi)容,提示一個(gè) JS 處理日期的小技巧,想獲取上個(gè)月最后一天,只需要設(shè)置SetDate參數(shù)為0即可。
var endDate = new Date(); //上個(gè)月最后一天 endDate.setDate(0);
接著正文開始:
使用 JS 獲取當(dāng)前月的最后一天,咱們通常的思路先獲取下個(gè)月的第一天,然后在減去一天,就是當(dāng)前月的最后一天,所以自然會(huì)用到下面的代碼:
var date= new Date(); date.setMonth(date.getMonth() + 1); //日期設(shè)置為0號(hào), 0表示1號(hào)的前一天 let lastDay = date.setDate(0); console.log('最后一天:' + new Date(lastDay).toLocaleString())
我寫此文的日期是2019.08.21
,所以打印結(jié)果如下:
最后一天:2019/8/31 下午4:10:43
那這樣的算法有沒有bug,咱們并不確定,所以為了還原現(xiàn)場,現(xiàn)在咱們從2019.01.31
一個(gè)一個(gè)來試試
var date= new Date(2019, 0, 31); //0 表示1月 date.setMonth(date.getMonth() + 1); // 日期設(shè)置為0號(hào), 0表示1號(hào)的前一天 let lastDay = date.setDate(0); console.log('最后一天:' + new Date(lastDay).toLocaleString())
打?。?/p>
最后一天:2019/2/28 上午12:00:00
咱們可以看到,我們把 1月31號(hào)
往后撥一個(gè)月在往前減一天,理應(yīng)得到的是 1月31號(hào)
,實(shí)際得到的是 2月28號(hào)
,所以咱們寫的代碼是有bug的。
這又是怎么肥事?
咱們可以列出月份:
1月 1 ....... 28 29 30 31
2月 1 ....... 28
3月 1 ....... 28 29 30 31
咱們通過 month + 1
,在 JS 中會(huì)理解成:
當(dāng)前日期 + 當(dāng)月的天數(shù)
所以上例中的 date.setMonth(date.getMonth() + 1)
等價(jià)于 1月31號(hào) + 31天
,根據(jù)上面的列表,就可以看到結(jié)果是3月3號(hào)
所以不要認(rèn)為 month + 1 就是月份加 1,它的意思是當(dāng)前日期加上當(dāng)月天數(shù) 。
那要怎么保證多了不會(huì)多跳一個(gè)月呢?
只要保證 month + 1
之前不會(huì)超過28
號(hào)就行啦,那要怎么做到呢?
推算:
- 31號(hào) + 31 會(huì)超
- 30號(hào) + 31 會(huì)超
- 29號(hào) + 31 會(huì)超
- 28號(hào) + 31 還是 28 號(hào) 剛好
所以秘訣在把31
號(hào)回?fù)艿?code>28號(hào)就行啦,所以多加以下這句話就行了:
date.setDate(28)
完整代碼:
var date= new Date(2019, 0, 31); //0 表示1月 date.setDate(28) date.setMonth(date.getMonth() + 1); // 日期設(shè)置為0號(hào), 0表示1號(hào)的前一天 let lastDay = date.setDate(0); console.log('最后一天:' + new Date(lastDay).toLocaleString())
運(yùn)行結(jié)果:
最后一天:2019/1/31 上午12:00:00
代碼部署后可能存在的BUG沒法實(shí)時(shí)知道,事后為了解決這些BUG,花了大量的時(shí)間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個(gè)好用的BUG監(jiān)控工具Fundebug。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js實(shí)現(xiàn)的點(diǎn)擊數(shù)量加一可操作數(shù)據(jù)庫
這篇文章主要介紹了js如何實(shí)現(xiàn)的點(diǎn)擊數(shù)量加一操作數(shù)據(jù)庫,需要的朋友可以參考下2014-05-05js之完全兼容ie與firefox的拖動(dòng)層代碼[測試好用]
經(jīng)測試,這個(gè)拖到效果不錯(cuò),多瀏覽器支持。方便做網(wǎng)站的朋友使用2008-10-10js實(shí)現(xiàn)一個(gè)猜數(shù)字游戲
本文主要介紹了js實(shí)現(xiàn)一個(gè)猜數(shù)字游戲的實(shí)例代碼。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-03-03你有必要知道的10個(gè)JavaScript難點(diǎn)
10個(gè)JavaScript難點(diǎn),你可能還不知道,不著急,本文為大家一一列出,一一攻破,感興趣的小伙伴們可以參考一下2017-07-07javascript實(shí)現(xiàn)京東登錄顯示隱藏密碼
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)京東登錄顯示隱藏密碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08深入理解JavaScript 中的執(zhí)行上下文和執(zhí)行棧
這篇文章主要介紹了JavaScript 中的執(zhí)行上下文和執(zhí)行棧的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10