解析JS在獲取當前月的最后一天遇到的坑
為了更好的講這節(jié)的內(nèi)容,提示一個 JS 處理日期的小技巧,想獲取上個月最后一天,只需要設(shè)置SetDate參數(shù)為0即可。
var endDate = new Date(); //上個月最后一天 endDate.setDate(0);
接著正文開始:
使用 JS 獲取當前月的最后一天,咱們通常的思路先獲取下個月的第一天,然后在減去一天,就是當前月的最后一天,所以自然會用到下面的代碼:
var date= new Date();
date.setMonth(date.getMonth() + 1);
//日期設(shè)置為0號, 0表示1號的前一天
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一個一個來試試
var date= new Date(2019, 0, 31); //0 表示1月
date.setMonth(date.getMonth() + 1);
// 日期設(shè)置為0號, 0表示1號的前一天
let lastDay = date.setDate(0);
console.log('最后一天:' + new Date(lastDay).toLocaleString())
打?。?/p>
最后一天:2019/2/28 上午12:00:00
咱們可以看到,我們把 1月31號往后撥一個月在往前減一天,理應(yīng)得到的是 1月31號,實際得到的是 2月28號,所以咱們寫的代碼是有bug的。
這又是怎么肥事?
咱們可以列出月份:
1月 1 ....... 28 29 30 31
2月 1 ....... 28
3月 1 ....... 28 29 30 31
咱們通過 month + 1,在 JS 中會理解成:
當前日期 + 當月的天數(shù)
所以上例中的 date.setMonth(date.getMonth() + 1) 等價于 1月31號 + 31天 ,根據(jù)上面的列表,就可以看到結(jié)果是3月3號

所以不要認為 month + 1 就是月份加 1,它的意思是當前日期加上當月天數(shù) 。
那要怎么保證多了不會多跳一個月呢?
只要保證 month + 1 之前不會超過28號就行啦,那要怎么做到呢?
推算:
- 31號 + 31 會超
- 30號 + 31 會超
- 29號 + 31 會超
- 28號 + 31 還是 28 號 剛好
所以秘訣在把31號回撥到28號就行啦,所以多加以下這句話就行了:
date.setDate(28)
完整代碼:
var date= new Date(2019, 0, 31); //0 表示1月
date.setDate(28)
date.setMonth(date.getMonth() + 1);
// 日期設(shè)置為0號, 0表示1號的前一天
let lastDay = date.setDate(0);
console.log('最后一天:' + new Date(lastDay).toLocaleString())
運行結(jié)果:
最后一天:2019/1/31 上午12:00:00
代碼部署后可能存在的BUG沒法實時知道,事后為了解決這些BUG,花了大量的時間進行l(wèi)og 調(diào)試,這邊順便給大家推薦一個好用的BUG監(jiān)控工具Fundebug。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入理解JavaScript系列(31):設(shè)計模式之代理模式詳解
這篇文章主要介紹了深入理解JavaScript系列(31):設(shè)計模式之代理模式詳解,代理模式使得代理對象控制具體對象的引用,代理幾乎可以是任何對象:文件,資源,內(nèi)存中的對象,或者是一些難以復(fù)制的東西,需要的朋友可以參考下2015-03-03
JavaScript 組件之旅(四):測試 JavaScript 組件
本期,我們要討論的話題是 JavaScript 的測試,以檢查組件的狀態(tài)和工作方式是否符合預(yù)期,還會介紹一個可以方便編寫測試用例的測試方法。這里說的測試當然是使用自動化的測試手段,這是軟件質(zhì)量保證(QA)的重要環(huán)節(jié)。2009-10-10
Cropper.js進階實現(xiàn)圖片旋轉(zhuǎn)裁剪處理功能示例
這篇文章主要為大家介紹了Cropper.js進階實現(xiàn)圖片旋轉(zhuǎn)裁剪功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
非常不錯的三種簡潔的Tab導(dǎo)航(網(wǎng)頁選項卡)簡析
非常不錯的三種簡潔的Tab導(dǎo)航(網(wǎng)頁選項卡)簡析...2007-08-08

