溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

解析JS在獲取當(dāng)前月的最后一天遇到的坑

發(fā)布時間:2020-10-13 02:20:44 來源:腳本之家 閱讀:160 作者:前端小智 欄目:web開發(fā)

為了更好的講這節(jié)的內(nèi)容,提示一個 JS 處理日期的小技巧,想獲取上個月最后一天,只需要設(shè)置SetDate參數(shù)為0即可。

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

接著正文開始:

使用 JS 獲取當(dāng)前月的最后一天,咱們通常的思路先獲取下個月的第一天,然后在減去一天,就是當(dāng)前月的最后一天,所以自然會用到下面的代碼:

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 中會理解成:

當(dāng)前日期 + 當(dāng)月的天數(shù)

所以上例中的 date.setMonth(date.getMonth() + 1) 等價于 1月31號 + 31天 ,根據(jù)上面的列表,就可以看到結(jié)果是3月3號

解析JS在獲取當(dāng)前月的最后一天遇到的坑

所以不要認(rèn)為 month + 1 就是月份加 1,它的意思是當(dāng)前日期加上當(dāng)月天數(shù) 。

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

只要保證 month + 1 之前不會超過28號就行啦,那要怎么做到呢?

推算:

  • 31號 + 31 會超
  • 30號 + 31 會超
  • 29號 + 31 會超
  • 28號 + 31 還是 28 號 剛好

所以秘訣在把31號回?fù)艿?code>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,花了大量的時間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個好用的BUG監(jiān)控工具Fundebug。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI