JS 在獲取當前月的最後一天遇到的坑

想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等着你!html

阿里雲最近在作活動,低至2折,有興趣能夠看看:
https://promotion.aliyun.com/...

爲了保證的可讀性,本文采用意譯而非直譯。前端

爲了更好的講這節的內容,提示一個 JS 處理日期的小技巧,想獲取上個月最後一天,只須要設置SetDate參數爲0便可。git

var endDate = new Date();
//上個月最後一天
endDate.setDate(0);

接着正文開始:github

使用 JS 獲取當前月的最後一天,我們一般的思路先獲取下個月的第一天,而後在減去一天,就是當前月的最後一天,因此天然會用到下面的代碼:算法

var date= new Date();
date.setMonth(date.getMonth() + 1);
//日期設置爲0號, 0表示1號的前一天
let lastDay = date.setDate(0);
console.log('最後一天:' + new Date(lastDay).toLocaleString())

我寫此文的日期是2019.08.21,因此打印結果以下:工具

最後一天:2019/8/31 下午4:10:43

那這樣的算法有沒有bug,我們並不肯定,因此爲了還原現場,如今我們從2019.01.31一個一個來試試學習

var date= new Date(2019, 0, 31); //0 表示1月
date.setMonth(date.getMonth() + 1);
// 日期設置爲0號, 0表示1號的前一天
let lastDay = date.setDate(0);
console.log('最後一天:' + new Date(lastDay).toLocaleString())

打印:阿里雲

最後一天:2019/2/28 上午12:00:00

我們能夠看到,咱們把 1月31號日後撥一個月在往前減一天,理應獲得的是 1月31號,實際獲得的是 2月28號,因此我們寫的代碼是有bug的。spa

這又是怎麼肥事?debug

我們能夠列出月份:

1月   1 ....... 28 29 30 31
2月   1 ....... 28 
3月   1 ....... 28 29 30 31

我們經過 month + 1,在 JS 中會理解成:

當前日期 + 當月的天數

因此上例中的 date.setMonth(date.getMonth() + 1) 等價於 1月31號 + 31天 ,根據上面的列表,就能夠看到結果是3月3號

clipboard.png

因此不要認爲 month + 1 就是月份加 1,它的意思是當前日期加上當月天數

那要怎麼保證多了不會多跳一個月呢?

只要保證 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);
// 日期設置爲0號, 0表示1號的前一天
let lastDay = date.setDate(0);
console.log('最後一天:' + new Date(lastDay).toLocaleString())

運行結果:

最後一天:2019/1/31 上午12:00:00

代碼部署後可能存在的BUG無法實時知道,過後爲了解決這些BUG,花了大量的時間進行log 調試,這邊順便給你們推薦一個好用的BUG監控工具 Fundebug

交流

乾貨系列文章彙總以下,以爲不錯點個Star,歡迎 加羣 互相學習。

https://github.com/qq44924588...

我是小智,公衆號「大遷世界」做者,對前端技術保持學習愛好者。我會常常分享本身所學所看的乾貨,在進階的路上,共勉!

關注公衆號,後臺回覆福利,便可看到福利,你懂的。

clipboard.png

相關文章
相關標籤/搜索