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