国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

獲取當(dāng)前月(季度/年)的最后一天(set相關(guān)操作及應(yīng)用)

2019-11-19 18:14:15
字體:
供稿:網(wǎ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ì)象。

到此,簡單地獲取當(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月,是存在的哦,不是不存在的0date.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開始,到4var 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)用里子

是醬紫的:

  1. 獲取本季度的最后一天; 當(dāng)今天是當(dāng)前季度最后一天切大于15日的時(shí)候(比如6月20日),返回下個(gè)季度的最后一天。
  2. 獲取本年最后一天;當(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è)月去。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持武林網(wǎng)!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 上饶市| 黔西县| 娄烦县| 彩票| 策勒县| 汉源县| 栖霞市| 兖州市| 拜泉县| 营山县| 赫章县| 福州市| 苍梧县| 凭祥市| 柳州市| 余干县| 小金县| 前郭尔| 天峨县| 怀远县| 陆河县| 黄骅市| 博爱县| 达日县| 迁安市| 辽阳县| 黎川县| 平顺县| 萍乡市| 化州市| 曲阜市| 曲阳县| 竹北市| 丰都县| 宁远县| 收藏| 河东区| 扶余县| 闸北区| 永康市| 永康市|