js日期计算常用函数大全

// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) { //author: meizz
    var o = {
        "M+": this.getMonth() + 1,                 //月份
        "d+": this.getDate(),                    //日
        "h+": this.getHours(),                   //小时
        "m+": this.getMinutes(),                 //分
        "s+": this.getSeconds(),                 //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

/**
 * 格式化日期 为 yyyy-MM-dd
 * @param date
 * @returns {string}
 */
function dateFormat(date) {
    if (!date || typeof (date) === "string") {
        this.error("参数异常,请检查...");
    }
    var y = date.getFullYear(); //年
    var m = date.getMonth() + 1; //月
    var d = date.getDate(); //日

    return y + "-" + m + "-" + d;
}

/**
 * 格式化月和日为MM、dd
 * @param value
 * @returns {string}
 */
function formatDate(value) {
    if (value < 10) {
        value = "0" + value;
    }
    return value;
}

/**
 * 获取指定日期的当周第一天
 * @param dd
 * @returns {string}
 */
function getFirstDayOfWeek(dd) {
    var week = dd.getDay(); //获取时间的星期数
    var minus = week ? week - 1 : 6;
    dd.setDate(dd.getDate() - minus); //获取minus天前的日期
    var y = dd.getFullYear();
    var m = dd.getMonth() + 1; //获取月份
    var d = dd.getDate();
    return y + "-" + formatDate(m) + "-" + formatDate(d);
}

/**
 * 获取当周 第一天 和 最后 一天
 * @returns {{firstDate: string, lastDate: string}}
 */
function getStartAndEndOfCurrWeek() {
    var d = new Date();
    var year = d.getFullYear();
    var month = parseInt(d.getMonth()) + 1;

    //获取周一
    var beginWhereTheTime = getFirstDayOfWeek(d);
    var dd = new Date(beginWhereTheTime);
    //获取周天
    dd.setDate(dd.getDate() + 6);
    var monthSunday = parseInt(dd.getMonth()) + 1;
    var endWhereTheTime = dd.getFullYear() + "-" + formatDate(monthSunday) + "-" + formatDate(dd.getDate());

    return {
        "firstDate": beginWhereTheTime,
        "lastDate": endWhereTheTime
    }
}

/**
 * 获取开始日期与结束日期之间的所有日期数组
 * @param begin
 * @param end
 * @returns {[]}
 */
function getAllDates(begin, end) { //返回 日期的数组 如 ['2020-07-10','2020-07-11']
    var arr = [];
    var ab = begin.split("-");
    var ae = end.split("-");
    var db = new Date();
    db.setUTCFullYear(ab[0], ab[1] - 1, ab[2]);
    var de = new Date();
    de.setUTCFullYear(ae[0], ae[1] - 1, ae[2]);
    var unixDb = db.getTime() - 24 * 60 * 60 * 1000;
    var unixDe = de.getTime() - 24 * 60 * 60 * 1000;
    for (var k = unixDb; k <= unixDe;) {
        //console.log((new Date(parseInt(k))).format());
        k = k + 24 * 60 * 60 * 1000;
        arr.push((new Date(parseInt(k))).Format('yyyy-MM-dd'));
    }
    return arr;
}

/**
 *
 * @param begin
 * @param end
 * @param fmt
 * @returns {[]}
 */
function getAllDatesFormat(begin, end,fmt) { //返回 日期的数组 如 ['2020-07-10','2020-07-11']
    var arr = [];
    var ab = begin.split("-");
    var ae = end.split("-");
    var db = new Date();
    db.setUTCFullYear(ab[0], ab[1] - 1, ab[2]);
    var de = new Date();
    de.setUTCFullYear(ae[0], ae[1] - 1, ae[2]);
    var unixDb = db.getTime() - 24 * 60 * 60 * 1000;
    var unixDe = de.getTime() - 24 * 60 * 60 * 1000;
    for (var k = unixDb; k <= unixDe;) {
        //console.log((new Date(parseInt(k))).format());
        k = k + 24 * 60 * 60 * 1000;
        arr.push((new Date(parseInt(k))).Format(fmt));
    }
    return arr;
}

/**
 * 获取当月第一天
 * @param dd
 * @returns {string}
 */
function getFirstDayOfCurrentMonth() {
    var now = new Date();
    now.setDate(1);
    var startDateStr = now.Format("yyyy-MM-dd");
    return startDateStr;
}
/**
 * 获取当月第一天
 * @param dd
 * @returns {string}
 */
function getCurrDate() {
    var now = new Date();
    var startDateStr = now.Format("yyyy-MM-dd");
    return startDateStr;
}
/**
 * 获取指定日期当月第一天
 * @param date
 * @returns {*}
 */
function getFirstDayOfMonth(date) {
    date.setDate(1);
    return dateFormat(date);
}

/**
 * 获取指定日期当年第一天
 * @param date
 * @returns {*}
 */
function getFirstDayOfYear (date) {
    date.setDate(1);
    date.setMonth(0);
    return dateFormat(date);
}

/**
 * 获取指定日期当季第一天
 * @param date
 * @returns {返回值为格式化的日期,yy-mm-dd}
 */
function getFirstDayOfSeason (date) {
    var month = date.getMonth();
    if(month <3 ){
        date.setMonth(0);
    }else if(2 < month && month < 6){
        date.setMonth(3);
    }else if(5 < month && month < 9){
        date.setMonth(6);
    }else if(8 < month && month < 11){
        date.setMonth(9);
    }
    date.setDate(1);
    return dateFormat(date);
}

/**
 * 根据 年份 和 季度  获取 季度 第一天 和 季度 最后 一天
 * @param year
 * @param quarter
 * @returns {{endDate: string, startDate: string}}
 */
function getStartEndOfQuarter(year,quarter) {
    let startMonth = 1;
    if(quarter == 1){
        startMonth = 1;
    }else if (quarter == 2){
        startMonth = 4;
    }else if (quarter == 3){
        startMonth = 7;
    }else if (quarter == 4){
        startMonth = 10;
    }
    let endMonth = startMonth + 2;
    if (quarter == 0){
        endMonth = 12
    }
    const startDate = year+"-"+formatDate(startMonth)+'-01';
    const endDate = year + '-' + formatDate(endMonth) + '-' +new Date(year,endMonth,0).getDate()
    return {startDate,endDate}
}

// 获取上一个月时间,返回yyyy-MM-dd字符串
function getLastMonthTime(date){
    //  1    2    3    4    5    6    7    8    9   10    11   12月
    var daysInMonth = [0,31,28,31,30,31,30,31,31,30,31,30,31];
    var strYear = date.getFullYear();
    var strDay = date.getDate();
    var strMonth = date.getMonth()+1;
    //一、解决闰年平年的二月份天数   //平年28天、闰年29天//能被4整除且不能被100整除的为闰年,或能被100整除且能被400整除
    if (((strYear % 4) === 0) && ((strYear % 100)!==0) || ((strYear % 400)===0)){
        daysInMonth[2] = 29;
    }
    if(strMonth - 1 === 0) //二、解决跨年问题
    {
        strYear -= 1;
        strMonth = 12;
    }
    else
    {
        strMonth -= 1;
    }
//  strDay = daysInMonth[strMonth] >= strDay ? strDay : daysInMonth[strMonth];
    strDay = Math.min(strDay,daysInMonth[strMonth]);//三、前一个月日期不一定和今天同一号,例如3.31的前一个月日期是2.28;9.30前一个月日期是8.30

    if(strMonth<10)//给个位数的月、日补零
    {
        strMonth="0"+strMonth;
    }
    if(strDay<10)
    {
        strDay="0"+strDay;
    }
    var datastr = strYear+"-"+strMonth+"-"+strDay;
    return datastr;
}

/* 获取上一个月
 *
 * @date 格式为yyyy-mm-dd的日期,如:2014-01-25
 */
function getPreMonth(date) {
    var arr = date.split('-');
    var year = arr[0]; //获取当前日期的年份
    var month = arr[1]; //获取当前日期的月份
    var day = arr[2]; //获取当前日期的日
    var days = new Date(year, month, 0);
    days = days.getDate(); //获取当前日期中月的天数
    var year2 = year;
    var month2 = parseInt(month) - 1;
    if (month2 == 0) {
        year2 = parseInt(year2) - 1;
        month2 = 12;
    }
    var day2 = day;
    var days2 = new Date(year2, month2, 0);
    days2 = days2.getDate();
    if (day2 > days2) {
        day2 = days2;
    }
    if (month2 < 10) {
        month2 = '0' + month2;
    }
    var t2 = year2 + '-' + month2 + '-' + day2;
    return t2;
}

/**
 * 获取下一个月
 *
 * @date 格式为yyyy-mm-dd的日期,如:2014-01-25
 */
function getNextMonth(date) {
    var arr = date.split('-');
    var year = arr[0]; //获取当前日期的年份
    var month = arr[1]; //获取当前日期的月份
    var day = arr[2]; //获取当前日期的日
    var days = new Date(year, month, 0);
    days = days.getDate(); //获取当前日期中的月的天数
    var year2 = year;
    var month2 = parseInt(month) + 1;
    if (month2 == 13) {
        year2 = parseInt(year2) + 1;
        month2 = 1;
    }
    var day2 = day;
    var days2 = new Date(year2, month2, 0);
    days2 = days2.getDate();
    if (day2 > days2) {
        day2 = days2;
    }
    if (month2 < 10) {
        month2 = '0' + month2;
    }

    var t2 = year2 + '-' + month2 + '-' + day2;
    return t2;
}

/**
 * 根据月份 和 年份 获取 当月 天数
 * @param year
 * @param month
 * @returns {number}
 */
function getLastDay(year,month) {
    var new_year = year; //取当前的年份
    var new_month = month++;//取下一个月的第一天,方便计算(最后一天不固定)
    if(month>12) {
        new_month -=12; //月份减
        new_year++; //年份增
    }
    var new_date = new Date(new_year,new_month,1); //取当年当月中的第一天
    return (new Date(new_date.getTime()-1000*60*60*24)).getDate();//获取当月最后一天日期
}
/**
 * 根据月份 和 年份 获取 当月 天数
 * @param year
 * @param month
 * @returns {number}
 */
function getLastDate(year,month) {
    var new_year = year; //取当前的年份
    var new_month = month;//取下一个月的第一天,方便计算(最后一天不固定)
    if(month>12) {
        new_month -=12; //月份减
        new_year++; //年份增
    }
    var new_date = new Date(new_year,new_month,1); //取当年当月中的第一天
    return year+"-"+formatDate(month)+"-"+formatDate((new Date(new_date.getTime()-1000*60*60*24)).getDate());//获取当月最后一天日期
}

function getFirstDay(year,month) {
    return year+"-"+formatDate(month)+"-01"
}


/**
 * 根据年份计算总周数
 * @param year
 * @returns {number}
 */
function getNumOfWeeks(year) {
    //设置为这一年开始日期
    var startDateOfYear = new Date(year, 0, 1);
    //计算这一年有多少天
    var daysOfYear = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 366 : 365;
    //366(365)/7=52.2(52.1),所以一般一年有52周余1天或者2天,当这一年有366天时且第一天是周日,那么他的最后一天则是周一,这一年就有54周。
    var weekNum = 53;
    //当年份是闰年且第一天是周日时有54周
    if (startDateOfYear.getDay() == 0 && daysOfYear == 366) {
        weekNum = 54;
    }
    return weekNum;
}
// 第n年的第n周,获取开始和结束时间 (星期一为一周的开始)
function weekDateOfYear(year,weekNo){
    // 此年1号是星期几
    let oneday = new Date(year+'-01-01').getDay() //0-6
    // 方便计算,当为星期天时为7
    if(oneday==0){
        oneday = 7
    }

    let one_fistday;
    let one_lastday;
    // 如果1号刚好是星期一
    if(oneday == 1){
        one_fistday = year+'-01-01'
        one_lastday = year+'-01-07'
    }else{
        let jj = 8-oneday
        one_fistday = (year-1)+'-12-'+(31-oneday+2>9?31-oneday+2:'0'+(31-oneday+2))
        one_lastday = year+'-01-'+(jj>9?jj:'0'+jj)
    }

    let fistday;
    let lastday;
    // 如果刚好是第一周
    if(weekNo ==1){
        fistday = one_fistday
        lastday = one_lastday
    }else{
        fistday = addDate(one_lastday,(weekNo-2)*7+1)
        lastday = addDate(one_lastday,(weekNo-1)*7)
    }
    return [fistday,lastday]
}
//日期加减法  date参数为计算开始的日期,days为需要加的天数
//格式:addDate('2017-1-11',20)
function addDate(date,days){
    var d=new Date(date);
    d.setDate(d.getDate()+days);
    var m=d.getMonth()+1;
    return d.getFullYear()+'-'+(m>9?m:'0'+m)+'-'+(d.getDate()>9?d.getDate():'0'+d.getDate());
}

/**
 *  获取本月第几周的方法:
 * @param a
 * @param b
 * @param c
 * @returns {{getYear: number, getMonth: number, getWeek: number}}
 */
var getMonthWeek = function (a, b, c) {
    /**
     * a = d = 当前日期
     * b = 6 - w = 当前周的还有几天过完(不算今天)
     * a + b 的和在除以7 就是当天是当前月份的第几周
     */
    var date = new Date(a, parseInt(b) - 1, c),
        w = date.getDay(),
        d = date.getDate();
    if(w==0){
        w=7;
    }
    var config={
        getMonth:date.getMonth()+1,
        getYear:date.getFullYear(),
        getWeek:Math.ceil((d + 6 - w) / 7),
    }
    return config;
};
/**
 * 获取年的第几周的方法:
 * @param a
 * @param b
 * @param c
 * @returns {number}
 */
var getYearWeek = function(a, b, c)
{
    /*
    date1是当前日期
    date2是当年第一天
    d是当前日期是今年第多少天
    用d + 当前年的第一天的周差距的和在除以7就是本年第几周
    */
    var date1 = new Date(a, parseInt(b) - 1, c),
        date2 = new Date(a, 0, 1),
        d = Math.round((date1.valueOf() - date2.valueOf()) / 86400000);
    return Math.ceil((d + ((date2.getDay() + 1) - 1)) / 7);
};

/**
 * 指定日期 当年第几周
 * @param dt
 * @returns {number}
 */
function getWeek(dt){
    let d1 = new Date(dt);
    let d2 = new Date(dt);
    d2.setMonth(0);
    d2.setDate(1);
    let rq = d1-d2;
    let days = Math.ceil(rq/(24*60*60*1000));
    let num = Math.ceil(days/7);
    return num;
}
/**
 * 今天 在 当年 第几周
 * @param dt
 * @returns {number}
 */
function getCurrYearWeek(){
    var now = new Date().Format('yyyy-MM-dd');
    return getWeek(now)
}

/**
 * 根据 颗粒度(分钟) 生成时间列表
 * @param num
 * @returns {[]}
 */
function getTimeList(num){
    var list = []
    var date=new Date();     
    date.setMinutes(0); 
    date.setHours(0);
    list.push(date.Format('hh:mm'))
    for (let i = 0; i < 3600; i++) {
        date.setMinutes(date.getMinutes()+num);
        list.push(date.Format('hh:mm'))
        if (date.getDay() > new Date().getDay()){
            break;
        }
    }
    list.pop();
    return list;
}


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值