獲取當(dāng)前月(季度/年)的最后一天(set相關(guān)操作及應(yīng)用)
今天我就只說 setFullYear, setMonth, setDate,因?yàn)榻裉斓膽?yīng)用只涉及到這三個(gè)。
這3個(gè)方法顧名思義分別設(shè)置年、月、日,之前我所了解到的應(yīng)用,比如“倒計(jì)時(shí)”中設(shè)置目標(biāo)時(shí)間點(diǎn)的時(shí)候會(huì)用到,其他的暫時(shí)記不起來,回頭再補(bǔ)。
今天來說說“獲取當(dāng)前月(季度/年)的最后一天”的用法
你可能想到了,每個(gè)月的天數(shù)是不應(yīng)定的,有28、29(閏年2月)、30、31,總不能去算一下現(xiàn)在是幾月份,然后去arr或者map(json)里邊去找對(duì)應(yīng)的日期吧,當(dāng)然這也是個(gè)方法,能達(dá)到效果(還要考慮閏年)。
那么,不這么繁瑣的話,怎么搞呢?
其實(shí),Date本來就會(huì)自動(dòng)處理每月的天數(shù),包括閏年什么的特殊情況,所以,這個(gè)我們根本不用去關(guān)心。
這里用到一個(gè)用法,估計(jì)大家有可能也用過,date.setDate(0)。沒錯(cuò),你沒看錯(cuò),就是0。(喂,這不是month啊,不用加1,你確定不是要用setDate(1) ?)
0是不存在的一天,date.setDate(0)之后,這一天不存在,或者說設(shè)置的是1號(hào)的前一天。那么,1號(hào)的前一天,自然就是前一個(gè)月的最后一天
var date = new Date(); console.log('今天是 ', date.getMonth() + 1, date.getDate()); date.setDate(0); console.log('上個(gè)月最后一天是 ', date.getMonth() + 1, date.getDate());
控制臺(tái)跑一下上邊代碼,就會(huì)得到上個(gè)月最后一天了。
繼續(xù),我們要得到的是這個(gè)月最后一天,怎么破
先把月份設(shè)置到下個(gè)月,然后獲取這個(gè)月最后一天:
date.setMonth(date.getMonth() + 1); date.setDate(0);
date就是這個(gè)月最后一天對(duì)應(yīng)的date對(duì)象。
到此,簡(jiǎn)單地獲取當(dāng)月最后一天已經(jīng)完了,改變setMonth可以讓你獲取任何一個(gè)月的最后一天了。
~~~~~~~~~~~~~~~~~~~~~~~~~ 分割線 ~~~~~~~~~~~~~~~~~~~~~~
下面,來講獲取這一年的最后一天的date。
同理,我們只要設(shè)置到明年就可以了,然后設(shè)置月份到0月(就是1月),然后設(shè)置到0日,這樣就成了2017-01-00,也就是元旦的前一天,當(dāng)然也就是2016-12-31這天了。
date.setFullYear(date.getFullYear() + 1); // 設(shè)置到明年 date.setMonth(0); // 明年的0月,也就是對(duì)應(yīng)到1月,是存在的哦,不是不存在的0 date.setDate(0); // 明年的0日
~~~~~~~~~~~~~~~~~~~~~~~~~ 又來分割線 ~~~~~~~~~~~~~~~~~~~~~
然后,又到了獲取當(dāng)前季度的最后一天。
Date中是沒有季度的概念的(如果有,請(qǐng)及時(shí)告訴我,讓我多個(gè)知識(shí)點(diǎn)),所以,首先我們要判斷當(dāng)前月在哪個(gè)季度
var m = date.getMonth(); var quarter = Math.floor(m / 3) + 1; // 從1開始,到4 var qLastMonth = quarter * 3;
其中,quarter 是第幾季度,qLastMonth 是這個(gè)季度的最后一個(gè)月是幾月 // 從1開始到12,當(dāng)年可以減去1,從0到11。
既然拿到了這個(gè)季度的最后一個(gè)月是幾月,那再用上邊的獲取任一月份的最后天的方法來處理就好了
date.setMonth(qLastMonth); date.setDate(0);
這時(shí)候,date就是當(dāng)前季度的最后一天的date對(duì)象了。當(dāng)然,做一下擴(kuò)展就可以拿到任意季度的最后一天,只要在第一步設(shè)置(喂喂,干嘛呢,繞遠(yuǎn)了)
要拿到任意季度的最后一天,比如第2季度,只需要。。。
date.setMonth(6); // 4 || 5 || 6 都行 date.setDate(0);
最后,來一個(gè)項(xiàng)目中遇到的實(shí)際應(yīng)用里子
是醬紫的:
- 獲取本季度的最后一天; 當(dāng)今天是當(dāng)前季度最后一天切大于15日的時(shí)候(比如6月20日),返回下個(gè)季度的最后一天。
- 獲取本年最后一天;當(dāng)今天是大于12月15日的時(shí)候,返回明年的最后一天。
開始的實(shí)現(xiàn)代碼如下:
/** * 獲取 當(dāng)前月/當(dāng)前年/當(dāng)前季度 的最后一天的date對(duì)象 * @param {String} type 類型選擇: month/m, year/y, quarter/q * @return {object} 最后一天的date對(duì)象,目前只可用到天 */ var SERVER_TIME = Date.now() / 1000; // 服務(wù)器時(shí)間,這里用本地時(shí)間代替 function getMaxDate(type) { var date = new Date(SERVER_TIME * 1000); var m = date.getMonth(); var y = date.getFullYear(); var d = date.getDay(); var today = date.getDate(); console.log(['SERVERTIME: ',y,'-',m+1,'-',today,' 星期',d].join('')); switch (type) { case 'm': case 'month': date.setMonth(m + 1); date.setDate(0); break; case 'y': case 'year': if (m == 11 && today >= 15) { date.setFullYear(y + 2); } else { date.setFullYear(y + 1); } date.setMonth(0); date.setDate(0); break; case 'q': case 'quarter': var qLastMonth = (Math.floor(m / 3) + 1) * 3; date.setMonth(qLastMonth); date.setDate(0); if (m === date.getMonth() && today >= 15) { date.setMonth(qLastMonth + 3); date.setDate(0); } break; default: date = null; } return date; }
然后,這段代碼有個(gè)大坑,平時(shí)還不一定能遇到,這不到年底了么,它就出來了(還好不是千年蟲之類的千年一遇)
季度選擇的時(shí)候,36行或?qū)е潞筮叺?8行的代碼塊出問題。
比如第2季度,是沒有問題的。36行設(shè)置date的日到30號(hào),即6月30日;假如滿足38行代碼邏輯的話,39-40行設(shè)置月份到9月30日,沒毛病,完美~
但是,假如現(xiàn)在是第1季度,36行設(shè)置日期到3月31日;假如滿足38行代碼邏輯的話,39-40行設(shè)置月份到6月31日,阿西吧,6月沒有31日,那么這時(shí)候得到的date,就會(huì)是~~~~沒錯(cuò),7月1日,自挖坑啊。
所以,改代碼
function getMaxDate(type) { var date = new Date(SERVER_TIME * 1000); var m = date.getMonth(); var y = date.getFullYear(); var d = date.getDay(); var today = date.getDate(); console.log(['SERVERTIME: ', y, '-', m + 1, '-', today, ' 星期', d].join('')); switch (type) { case 'm': case 'month': date.setMonth(m + 1); date.setDate(0); break; case 'y': case 'year': if (m == 11 && today >= 15) { date.setFullYear(y + 2); } else { date.setFullYear(y + 1); } date.setMonth(0); date.setDate(0); break; case 'q': case 'quarter': var qLastMonth = (Math.floor(m / 3) + 1) * 3; if (m === date.getMonth() && today >= 15) { date.setMonth(qLastMonth + 3); } else { date.setMonth(qLastMonth); } date.setDate(0); // 得到當(dāng)前季度最后一天的date break; default: date = null; } return date; }
這里得到一個(gè)注意項(xiàng),月份的相關(guān)判斷,一定要在日的設(shè)置之前做好,不要再日期設(shè)置后在操作月份;或者你把日期設(shè)置到1-28之間任意數(shù)字,也就是保證不會(huì)跑到下一個(gè)月去。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- 獲取當(dāng)前月(季度/年)的最后一天(set相關(guān)操作及應(yīng)用)
- C#巧用DateTime預(yù)設(shè)可選的日期范圍(如本年度、本季度、本月等)
- php根據(jù)年月獲取季度的方法
- 實(shí)現(xiàn)一個(gè)年、月、季度聯(lián)動(dòng)SELECT的javascript代碼
- JavaScript獲取某年某月的最后一天附截圖
- JS獲取月的最后一天與JS得到一個(gè)月份最大天數(shù)的實(shí)例代碼
- js獲取當(dāng)月最后一天實(shí)例代碼
- js獲取當(dāng)前月的第一天和最后一天的小例子
- js獲取某月的最后一天日期的簡(jiǎn)單實(shí)例
- JavaScript 取一個(gè)月的最后一天
相關(guān)文章
微信小程序中使用vant組件庫(kù)的超詳細(xì)圖文教程
說到vant框架相信大家應(yīng)該并不陌生了吧,做過移動(dòng)端開發(fā)的小伙伴們應(yīng)該都知道它吧,下面這篇文章主要給大家介紹了關(guān)于微信小程序中使用vant組件庫(kù)的超詳細(xì)圖文教程,需要的朋友可以參考下2023-03-03通過javascript實(shí)現(xiàn)掃雷游戲代碼實(shí)例
這篇文章主要介紹了通過javascript實(shí)現(xiàn)掃雷游戲代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02JS實(shí)現(xiàn)的4種數(shù)字千位符格式化方法分享
這篇文章主要介紹了JS實(shí)現(xiàn)的4種數(shù)字千位符格式化方法分享,本文給出了4種千分位格式化方法并對(duì)它們的性能做了比較,需要的朋友可以參考下2015-03-03微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法
這篇文章主要為大家詳細(xì)介紹了微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02three.js中文文檔學(xué)習(xí)之通過模塊導(dǎo)入
這篇文章主要給大家介紹了關(guān)于three.js中文文檔學(xué)習(xí)之通過模塊導(dǎo)入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用three.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11