1. 程式人生 > >JS獲取指定日期前後N天的日期、前N個月日期、後N個月日期

JS獲取指定日期前後N天的日期、前N個月日期、後N個月日期

   今天做專案遇到了,獲取相對於當前日期前30天的時間,結合網上資料,做了一份整理。

一.獲取指定日期前或者後指定間隔時間程式碼

function getNowFormatDate(sdate,interval,caret) {
    var patt1 =  /^\d{4}-([0-1]?[0-9])-([0-3]?[0-9])$/;  //判斷輸入的日期是否符合格式正則表示式
    if(!(sdate && typeof(sdate) == "string" &&  patt1.test(sdate))){
        sdate = new Date(); //不滿足日期的則使用當前年月日
    }
    interval = isNaN(parseInt(interval)) ? 0 : parseInt(interval);//若沒有輸入間隔,則使用當前日
  caret = (caret && typeof(caret) == "string") ? caret : "";
    var gdate = new Date(sdate).getTime();//獲取指定年月日
    gdate = gdate + 1000*60*60*24*interval; //加減相差毫秒數


    var speDate = new Date(gdate);//獲取指定好毫秒數時間
    var preYear = speDate.getFullYear();
    var preMonth = speDate.getMonth() + 1;
    var preDay = speDate.getDate();
    preMonth = (preMonth < 10) ? ("0" + preMonth) :preMonth;
    preDay = (preDay < 10) ? ("0" + preDay) :preDay;
    var preDate =  preYear + caret +  preMonth + caret + preDay;
    return preDate;
}

呼叫例子:  獲取當天日期     getNowFormatDate("",0,"-"); 結果為"2018-09-18";

                    獲取前一天日期  getNowFormatDate("2018-03-01",-1,"-"); 結果為"2018-02-18";

                    獲取後一天日期  getNowFormatDate("2018-02-28",1,"-"); 結果為"2018-03-01"; 

                    獲取前一週日期  getNowFormatDate("2018-03-01",-7,"-"); 結果為"2018-02-22";

                    獲取後一週日期  getNowFormatDate("2018-03-01",7,"-"); 結果為"2018-03-08";

                    獲取前30天日期  getNowFormatDate("2018-09-18",-30,"-"); 結果為"2018-02-22";

該函式的優點是通用性高,只要傳入需要的指定時間、間隔日期即可,缺點是當獲取前後一個月、三個月、一年等存在誤差。

二.獲取指定日期前N月程式碼

function getpreDate(sdate,monthNum,caret) {        

       var speYear = "";
        var speMonth = "";
        var speDate = "";
        var patt1 =  /^\d{4}-([0-1]?[0-9])-([0-3]?[0-9])$/; 
        if(!(sdate && typeof(sdate) == "string" &&  patt1.test(sdate))){
            sdate = new Date();
            speYear = sdate.getFullYear();
            speMonth = sdate.getMonth() + 1;
            speDate = sdate.getDate();
        }
        else{
            var sdateAry = sdate.split("-");
            speYear = parseInt(sdateAry[0]);
            speMonth = parseInt(sdateAry[1]);
            speDate = parseInt(sdateAry[2]);        
        }
        monthNum = isNaN(parseInt(monthNum)) ? 0 : parseInt(monthNum);
      caret = (caret && typeof(caret) == "string") ? caret : "";
        var preYear = speYear;
        var preMonth = speMonth - monthNum;
        if(preMonth <= 0){ //如差的月份小於0,則將對應的年月做修改
            preYear = preYear - (preMonth/12 > 0) ? preMonth/12 : 1;
            preMonth = 12 - (Math.abs(preMonth)%12);
        }

        var preDate = speDate;
        var preDates = new Date(preYear,preMonth,0);
        var preDateAll = preDates.getDate(); //獲取指定月份的總日數
        if(preDate > preDateAll){ //若指定日大於指定月份所含有的天數,則使用指定月份最大的天數
             preDate = preDateAll;
        }

    var preDate =  preYear + caret +  preMonth + caret + preDate;
    return preDate;    

}

該函式的優點是通用性高,只要傳入需要的指定時間、指定間隔月份即可,月份中的天數不同不會影響最終結果所得月份

三.獲取指定日期後N月程式碼

四.知識點

【1】Date():(1)作用:獲取當前日期和時間;                                                                                                                                            (2)語法:[1]Date()不傳入任何引數的情況下,獲取當前時刻的日期和時間;                                                                                        (2)Date(傳入日期毫秒數)根據傳入引數,建立特定日期和時間,獲取日期毫秒數的簡單方法可以是Date.parse()和Date.UTC(),還可以直接傳入Number型別的毫秒數,其中Date.parse()中只要是常規的日期表示法,都可以正常轉換,規則是支援年月日、月日年格式、日月年格式(該格式時月必須使用英文,不能使用數字),其中年月日之間的間隔可以是空格( )、反斜槓(/)、連字元-、逗號(,),月可以使用英文全寫法和縮寫法,暫不支援其他情況,例如"2018-09-18"(年月日的格式,還可以使用"2018 09 18"(其中空格可以換為逗號, 反斜槓/ 連字元-),但是不能直接使用20180918、"20180918"、2018/09/18、2018-09-18)、"September 18 2018"(月日年格式,月份也可以使用簡寫Sept.或Sept,還可以使用"09 18 2018"(其中空格可以換為逗號, 反斜槓/ 連字元-),但是不能使用"0918208"、"09\18\2018"); "18-Sept-2018" (日月年格式,其他月必須為英文全寫或者簡寫,還可以使用"18 Sept 2018"(其中空格可以換為逗號, 反斜槓/  連字元- 斜槓\ ),但是不能使用"18 09 2018")                                                                       其中Date.UTC()中引數是年,基於0的月份(0-11),月中的哪一天(1-31),小時數(0-23),分鐘,秒,毫秒,其中年月必須,其他都可以使用預設值(天的預設值為1,其他全部為0) ,其中引數可以是Number型別也可以是Number型別;                                                   (3)Date(日期字串) ,日期格式跟上的Date.parse一致,因為傳入字串後後臺會自動呼叫Date.parse();                                  (4)Date(年,月,日,時,分,秒,毫秒數) ,日期格式跟上的Date.UTC一致,因為傳入字串後後臺會自動呼叫Date.UTC();   

 【2】Date.now():返回呼叫該方法的日期和時間距離時間零點(1970-01-01 00:00:00 UTC),返回值型別為Number,支援的瀏覽器有IE9+、 Firefox 3+、 Safari 3+、 Opera 10.5 和 Chrome,在不支援的瀏覽器中可以使用 +模擬,例如 var t = +new  Date(),Date.now() == (+new Date());其中是由於Date的valueOf()方法會轉換為毫秒數,在進行日期計算以及比較時會自動呼叫該方法。

【3】一系列get類方法獲取日期時間資料:(1)getFullYear():返回例項物件的四位年份,例如var t = (new Date("2018-09-18")).getFullYear(),t=2018;       (2)getMonth()::返回例項物件的月份(0-11),例如:var t = (new Date("2018-09-18")).getMonth(),t=9;     (3)getDate():返回例項物件對應月份的幾號(1-31),例如:var t = (new Date("2018-09-18")).getDate(),t=18;        (4)getHours():返回例項物件對應的小時數(0-23,例如:var t = (new Date()).getHours();t=21;   (5)getMinutes:返回例項物件對應的分鐘(0-59),例如:var t = (new Date()).getMinutes();t=30;   (6)getSeconds():返回例項物件對應的秒數(0-59),例如:var t = (new Date()).getMinutes();t=53;  (7)getMilliseconds():返回例項物件對應的秒數(0-999),例如:var t = (new Date()).getMilliseconds();t=957;      (8)getDay():返回例項物件對應的星期幾(星期日為0,星期一為1,值為0-6),例如:var t = (new Date("2018-09-18")).getDay(),t=2(表示星期三);   (9)getTime():返回例項日期距離時間零點毫秒數(1970-01-01 00:00:00 UTC),等同於valueOf(),例如var t = (new Date("2018-09-18")).getTime(),t=1537228800000;注意:這些方法的返回值型別都是Number。

【4】一系列set類方法設定日期資料: