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類方法設定日期資料: