Date小技巧:set相關操作及應用_獲取當前月(季度/年)的最後一天

来源:http://www.cnblogs.com/ufex/archive/2016/12/27/get_last_day.html
-Advertisement-
Play Games

set操作還是有不少的,具體見 http://www.w3school.com.cn/jsref/jsref_obj_date.asp, 今天我就只說 setFullYear, setMonth, setDate,因為今天的應用只涉及到這三個。 這3個方法顧名思義分別設置年、月、日,之前我所瞭解到的 ...


 

set操作還是有不少的,具體見 http://www.w3school.com.cn/jsref/jsref_obj_date.asp

今天我就只說 setFullYear, setMonth, setDate,因為今天的應用只涉及到這三個。

 

這3個方法顧名思義分別設置年、月、日,之前我所瞭解到的應用,比如“倒計時”中設置目標時間點的時候會用到,其他的暫時記不起來,回頭再補。

今天來說說“獲取當前月(季度/年)的最後一天”的用法

 

你可能想到了,每個月的天數是不應定的,有28、29(閏年2月)、30、31,總不能去算一下現在是幾月份,然後去arr或者map(json)裡邊去找對應的日期吧,當然這也是個方法,能達到效果(還要考慮閏年)。

那麼,不這麼繁瑣的話,怎麼搞呢?

其實,Date本來就會自動處理每月的天數,包括閏年什麼的特殊情況,所以,這個我們根本不用去關心。

這裡用到一個用法,估計大家有可能也用過,date.setDate(0)。沒錯,你沒看錯,就是0。(喂,這不是month啊,不用加1,你確定不是要用setDate(1) ?)

0是不存在的一天,date.setDate(0)之後,這一天不存在,或者說設置的是1號的前一天。那麼,1號的前一天,自然就是前一個月的最後一天

1 var date = new Date();
2 console.log('今天是 ', date.getMonth() + 1, date.getDate());
3 date.setDate(0);
4 console.log('上個月最後一天是 ', date.getMonth() + 1, date.getDate());

 控制台跑一下上邊代碼,就會得到上個月最後一天了。

 

繼續,我們要得到的是這個月最後一天,怎麼破

先把月份設置到下個月,然後獲取這個月最後一天: 

1 date.setMonth(date.getMonth() + 1);
2 date.setDate(0);

date就是這個月最後一天對應的date對象。

到此,簡單地獲取當月最後一天已經完了,改變setMonth可以讓你獲取任何一個月的最後一天了。

~~~~~~~~~~~~~~~~~~~~~~~~~   分割線   ~~~~~~~~~~~~~~~~~~~~~~

 

下麵,來講獲取這一年的最後一天的date。

同理,我們只要設置到明年就可以了,然後設置月份到0月(就是1月),然後設置到0日,這樣就成了2017-01-00,也就是元旦的前一天,當然也就是2016-12-31這天了。

1 date.setFullYear(date.getFullYear() + 1); // 設置到明年
2 date.setMonth(0); // 明年的0月,也就是對應到1月,是存在的哦,不是不存在的0
3 date.setDate(0); // 明年的0日

 

~~~~~~~~~~~~~~~~~~~~~~~~~  又來分割線   ~~~~~~~~~~~~~~~~~~~~~

 

然後,又到了獲取當前季度的最後一天。

Date中是沒有季度的概念的(如果有,請及時告訴我,讓我多個知識點),所以,首先我們要判斷當前月在哪個季度

1 var m = date.getMonth();
2 var quarter = Math.floor(m / 3) + 1; // 從1開始,到4
3 var qLastMonth = quarter * 3;

其中,quarter 是第幾季度,qLastMonth 是這個季度的最後一個月是幾月 // 從1開始到12,當年可以減去1,從0到11。

既然拿到了這個季度的最後一個月是幾月,那再用上邊的獲取任一月份的最後天的方法來處理就好了

1 date.setMonth(qLastMonth);
2 date.setDate(0);

這時候,date就是當前季度的最後一天的date對象了。當然,做一下擴展就可以拿到任意季度的最後一天,只要在第一步設置(喂喂,幹嘛呢,繞遠了)

要拿到任意季度的最後一天,比如第2季度,只需要。。。  

1 date.setMonth(6); // 4 || 5 || 6 都行
2 date.setDate(0);

 

 

最後,來一個項目中遇到的實際應用裡子

是醬紫的:

    1、獲取本季度的最後一天; 當今天是當前季度最後一天切大於15日的時候(比如6月20日),返回下個季度的最後一天。

    2、獲取本年最後一天;當今天是大於12月15日的時候,返回明年的最後一天。

 

開始的實現代碼如下:

 1 /**
 2  * 獲取 當前月/當前年/當前季度 的最後一天的date對象
 3  * @param  {String} type 類型選擇: month/m, year/y, quarter/q
 4  * @return {object}      最後一天的date對象,目前只可用到天
 5  */
 6 
 7 var SERVER_TIME = Date.now() / 1000; // 伺服器時間,這裡用本地時間代替
 8 
 9 function getMaxDate(type) {
10     var date = new Date(SERVER_TIME * 1000);
11     var m = date.getMonth();
12     var y = date.getFullYear();
13     var d = date.getDay();
14     var today = date.getDate();
15     console.log(['SERVERTIME: ',y,'-',m+1,'-',today,' 星期',d].join(''));
16     switch (type) {
17         case 'm':
18         case 'month':
19             date.setMonth(m + 1);
20             date.setDate(0);
21             break;
22         case 'y':
23         case 'year':
24             if (m == 11 && today >= 15) {
25                 date.setFullYear(y + 2);
26             } else {
27                 date.setFullYear(y + 1);
28             }
29             date.setMonth(0);
30             date.setDate(0);
31             break;
32         case 'q':
33         case 'quarter':
34             var qLastMonth = (Math.floor(m / 3) + 1) * 3;
35             date.setMonth(qLastMonth);
36             date.setDate(0);
37 
38             if (m === date.getMonth() && today >= 15) {
39                 date.setMonth(qLastMonth + 3);
40                 date.setDate(0);
41             }
42             break;
43         default:
44             date = null;
45     }
46 
47     return date;
48 }

 

然後,這段代碼有個大坑,平時還不一定能遇到,這不到年底了麽,它就出來了(還好不是千年蟲之類的千年一遇)

季度選擇的時候,36行或導致後邊的38行的代碼塊出問題。

比如第2季度,是沒有問題的。36行設置date的日到30號,即6月30日;假如滿足38行代碼邏輯的話,39-40行設置月份到9月30日,沒毛病,完美~

 

但是,假如現在是第1季度,36行設置日期到3月31日;假如滿足38行代碼邏輯的話,39-40行設置月份到6月31日,阿西吧,6月沒有31日,那麼這時候得到的date,就會是~~~~沒錯,7月1日,自挖坑啊。

 

所以,改代碼

 1 function getMaxDate(type) {
 2     var date = new Date(SERVER_TIME * 1000);
 3     var m = date.getMonth();
 4     var y = date.getFullYear();
 5     var d = date.getDay();
 6     var today = date.getDate();
 7     console.log(['SERVERTIME: ', y, '-', m + 1, '-', today, ' 星期', d].join(''));
 8     switch (type) {
 9         case 'm':
10         case 'month':
11             date.setMonth(m + 1);
12             date.setDate(0);
13             break;
14         case 'y':
15         case 'year':
16             if (m == 11 && today >= 15) {
17                 date.setFullYear(y + 2);
18             } else {
19                 date.setFullYear(y + 1);
20             }
21             date.setMonth(0);
22             date.setDate(0);
23             break;
24         case 'q':
25         case 'quarter':
26             var qLastMonth = (Math.floor(m / 3) + 1) * 3;
27             if (m === date.getMonth() && today >= 15) {
28                 date.setMonth(qLastMonth + 3);
29             } else {
30                 date.setMonth(qLastMonth);
31             }
32             date.setDate(0); // 得到當前季度最後一天的date
33             break;
34         default:
35             date = null;
36     }
37 
38     return date;
39 }

 

 這裡得到一個註意項,月份的相關判斷,一定要在日的設置之前做好,不要再日期設置後在操作月份;或者你把日期設置到1-28之間任意數字,也就是保證不會跑到下一個月去。

 

bla~bla~說了一堆,有些廢話,反正是有感而寫,就當一次記錄吧~~


 

see U

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前一篇文中,我們對一個聚合SDK服務端所需要實現的功能作了簡單的分析。通過兩個主要場景的功能流程圖,我們可以看到,作為多款游戲要適配多個渠道的統一請求轉發中心,TYPESDK服務端主要需要實現的功能有以下幾個要點: l 接收請求和返迴響應,通常是HTTP的請求響應。 l 獲取配置信息。 n 識別游 ...
  • 記得第一次接觸HTML5還是在《聯信永益》實習那會兒(2011),當時一個項目技術選型的時候面臨兩種選擇,分別是Silverlight和HTML5,記得當年用的最新的IE瀏覽器版本還是IE9,才剛剛開始支持HTML5。後來考慮到當時各個版本的瀏覽器對HTML5的支持都不怎麼好,最終公司還是選擇了Si ...
  • 周一沒有看聖誕大戰,這幾天比較忙也沒有看賽後的報道,今天就先不扯NBA,隨便扯扯自己。昨天在電腦里找東西的時候翻到以前兼職健身教練時的照片,思緒一下子回到學生時代,腦子久久換不過來。現在深深覺得健身和寫代碼真的是兩個極端,一個往死里做(做動作),一個往死里坐(坐椅子),現在的體重和巔峰時期足足差了6 ...
  • 通常我們說的 Web 動畫,包含了三大類。 CSS3 動畫 javascript 動畫(canvas) html 動畫(SVG) 個人認為 3 種動畫各有優劣,實際應用中根據掌握情況作出取捨,本文討論的是我認為 SVG 中在實際項目中非常有應用價值 SVG 線條動畫。 舉個慄子 SVG 線條動畫,在 ...
  • 安卓手機點擊a標簽去除點擊陰影 在微信瀏覽器中,鏈接到appstore的跳轉全都被屏蔽了(噁心吧),解決辦法一是通過跳轉到騰訊的微應用(應用寶)中,才能通過它接著跳轉到appstore,但是應用寶規定,必須把app上傳到他們平臺審核通過後才能有這個功能,和蘋果商店類似,但是如果沒有安卓版本的app, ...
  • react中想要實現折線圖和餅圖的功能,需要引入react-echarts包,然後再實現折線圖的功能。我這裡引用的版本是:0.1.1。其他的寫法參echarts官網即可。下麵詳細講解的是我在react+redux+router+webpack+antd腳手架上面完成的折線圖和餅圖。 這篇文章主要講解 ...
  • 對於css3的漸變前端的童鞋一定不陌生,在一些電商網站會為了美化將地址選擇做成信封樣式(個人感覺很稀飯~),看了一下它的實現方式,大多數是以圖片的形式,持著優化的心態嘗試著用css3 linear-gradient實現信封效果一下是效果圖 下麵我們開始嘍~ html結構如下: <div class= ...
  • datatables中的Options總結(3) colReorder.fixedColumnsLeft 不允許x列重新排序(從左數) colReorder.fixedColumnsRight 不允許x列重新排序(從右邊數) colReorder.order 設置一個預設訂單表中的列 colReor ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...