獲取當(dāng)前月(季度/年)的最后一天(set相關(guān)操作及應(yīng)用)
今天我就只說 setFullYear, setMonth, setDate,因?yàn)榻裉斓膽?yīng)用只涉及到這三個。
這3個方法顧名思義分別設(shè)置年、月、日,之前我所了解到的應(yīng)用,比如“倒計時”中設(shè)置目標(biāo)時間點(diǎn)的時候會用到,其他的暫時記不起來,回頭再補(bǔ)。
今天來說說“獲取當(dāng)前月(季度/年)的最后一天”的用法
你可能想到了,每個月的天數(shù)是不應(yīng)定的,有28、29(閏年2月)、30、31,總不能去算一下現(xiàn)在是幾月份,然后去arr或者map(json)里邊去找對應(yīng)的日期吧,當(dāng)然這也是個方法,能達(dá)到效果(還要考慮閏年)。
那么,不這么繁瑣的話,怎么搞呢?
其實(shí),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對象。
到此,簡單地獲取當(dāng)月最后一天已經(jīng)完了,改變setMonth可以讓你獲取任何一個月的最后一天了。
~~~~~~~~~~~~~~~~~~~~~~~~~ 分割線 ~~~~~~~~~~~~~~~~~~~~~~
下面,來講獲取這一年的最后一天的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月,也就是對應(yīng)到1月,是存在的哦,不是不存在的0 date.setDate(0); // 明年的0日
~~~~~~~~~~~~~~~~~~~~~~~~~ 又來分割線 ~~~~~~~~~~~~~~~~~~~~~
然后,又到了獲取當(dāng)前季度的最后一天。
Date中是沒有季度的概念的(如果有,請及時告訴我,讓我多個知識點(diǎn)),所以,首先我們要判斷當(dāng)前月在哪個季度
var m = date.getMonth(); var quarter = Math.floor(m / 3) + 1; // 從1開始,到4 var qLastMonth = quarter * 3;
其中,quarter 是第幾季度,qLastMonth 是這個季度的最后一個月是幾月 // 從1開始到12,當(dāng)年可以減去1,從0到11。
既然拿到了這個季度的最后一個月是幾月,那再用上邊的獲取任一月份的最后天的方法來處理就好了
date.setMonth(qLastMonth); date.setDate(0);
這時候,date就是當(dāng)前季度的最后一天的date對象了。當(dāng)然,做一下擴(kuò)展就可以拿到任意季度的最后一天,只要在第一步設(shè)置(喂喂,干嘛呢,繞遠(yuǎn)了)
要拿到任意季度的最后一天,比如第2季度,只需要。。。
date.setMonth(6); // 4 || 5 || 6 都行 date.setDate(0);
最后,來一個項目中遇到的實(shí)際應(yīng)用里子
是醬紫的:
- 獲取本季度的最后一天; 當(dāng)今天是當(dāng)前季度最后一天切大于15日的時候(比如6月20日),返回下個季度的最后一天。
- 獲取本年最后一天;當(dāng)今天是大于12月15日的時候,返回明年的最后一天。
開始的實(shí)現(xiàn)代碼如下:
/**
* 獲取 當(dāng)前月/當(dāng)前年/當(dāng)前季度 的最后一天的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); // 得到當(dāng)前季度最后一天的date
break;
default:
date = null;
}
return date;
}
這里得到一個注意項,月份的相關(guān)判斷,一定要在日的設(shè)置之前做好,不要再日期設(shè)置后在操作月份;或者你把日期設(shè)置到1-28之間任意數(shù)字,也就是保證不會跑到下一個月去。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
- 獲取當(dāng)前月(季度/年)的最后一天(set相關(guān)操作及應(yīng)用)
- C#巧用DateTime預(yù)設(shè)可選的日期范圍(如本年度、本季度、本月等)
- php根據(jù)年月獲取季度的方法
- 實(shí)現(xiàn)一個年、月、季度聯(lián)動SELECT的javascript代碼
- JavaScript獲取某年某月的最后一天附截圖
- JS獲取月的最后一天與JS得到一個月份最大天數(shù)的實(shí)例代碼
- js獲取當(dāng)月最后一天實(shí)例代碼
- js獲取當(dāng)前月的第一天和最后一天的小例子
- js獲取某月的最后一天日期的簡單實(shí)例
- JavaScript 取一個月的最后一天
相關(guān)文章
通過javascript實(shí)現(xiàn)掃雷游戲代碼實(shí)例
這篇文章主要介紹了通過javascript實(shí)現(xiàn)掃雷游戲代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
JS實(shí)現(xiàn)的4種數(shù)字千位符格式化方法分享
這篇文章主要介紹了JS實(shí)現(xiàn)的4種數(shù)字千位符格式化方法分享,本文給出了4種千分位格式化方法并對它們的性能做了比較,需要的朋友可以參考下2015-03-03
three.js中文文檔學(xué)習(xí)之通過模塊導(dǎo)入
這篇文章主要給大家介紹了關(guān)于three.js中文文檔學(xué)習(xí)之通過模塊導(dǎo)入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用three.js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11

