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类方法设置日期数据:

                  

你可能感兴趣的:(WEB前端知识点)