日期相关的一些简单计算:格式化,上个月,前一天

关于日期计算,做个小笔记。

格式化

Date.prototype.formatStr = function(format) {
    var o = {
        "M+": this.getMonth() + 1, // month
        "D+": this.getDate(), // day
        "h+": this.getHours(), // hour
        "m+": this.getMinutes(), // minute
        "s+": this.getSeconds(), // second
        "q+": Math.floor((this.getMonth() + 3) / 3), // quarter,季度
        "S": this.getMilliseconds()
    };

    if (/(Y+)/.test(format)) {
        format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    }

    for (var k in o) {
        if (new RegExp("(" + k + ")").test(format)) {
            format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : padLeftZero(o[k]);
        }
    }
    return format;
    
    // 左侧补零
    function padLeftZero (str) {
        return ('00' + str).substr((str + '').length);
    }
};

上个月

var now = new Date();
var fullyear = now.getFullYear();
var month = now.getMonth();

// 上个月第一天
var prevMonthFirst = new Date(fullyear, month - 1, 1);

// 上个月有多少天
// new Date(2019, 1, 0).getDate(); // 表示 2019/1/1的前一天,即 2018/12/31,通常用这个来计算某月的天数
var prevMonthDays = new Date(fullyear, month, 0).getDate();

// 上个月最后一天
var prevMonthLast = new Date(fullyear, month -1, prevMonthDays).formatStr('YYYY-MM-DD');

根据上面的规律,可计算得到下个月。简单封装一个方法,求:获取给定日期的指定月份的开始、结束日期

function getMonthByDate (date, months, formate) {
    formate = formate || "YYYY-MM-DD";
    date = new Date(date.replace(/-/g, "/"));
    var fullyear = date.getFullYear();
    var month = date.getMonth() + months;
    
    // 指定月第一天
    var monthFirst = new Date(fullyear, month, 1).formatStr(formate);
    
    // 指定月有多少天
    // new Date(2019, 1, 0).getDate(); // 表示 2019/1/1的前一天,即 2018/12/31,通常用这个来计算某月的天数
    var monthDays = new Date(fullyear, month + 1, 0).getDate();
    
    // 指定月最后一天
    var monthLast = new Date(fullyear, month, monthDays).formatStr(formate);
    
    return {
        first: monthFirst,
        last: monthLast
    }
};

// 举例
getMonthByDate('2018-9-17', -1); // 上个月 {first: "2018-08-01", last: "2018-08-31"}

getMonthByDate('2018-9-17', -2); // {first: "2018-07-01", last: "2018-07-31"}

getMonthByDate('2018-9-17', -3); // {first: "2018-06-01", last: "2018-06-30"}

getMonthByDate('2018-9-17', -7); // {first: "2018-02-01", last: "2018-02-28"}

getMonthByDate('2018-9-17', 1); // 下个月 {first: "2018-10-01", last: "2018-10-31"}

getMonthByDate('2018-9-17', 2); // {first: "2018-11-01", last: "2018-11-30"}

前一天

var now = new Date();

// 前一天
var prevDate = new Date(now.setDate(now.getDate() - 1)).formatStr('YYYY-MM-DD');

前一天比较简单,也简单封装一个方法,求:获取给定日期加指定天数的日期

function getNewDateByDate (date, days, formate) {
    formate = formate || "YYYY-MM-DD";
    date = new Date(date.replace(/-/g, "/"));
    return new Date(date.setDate(date.getDate() + days)).formatStr(formate);
}

举例:
getNewDateByDate('2019-1-4', -1); // 前一天,"2019-01-03"
getNewDateByDate('2019-1-4', 1); // 后一天,"2019-01-05"

日期比较

new Date('2019-01-03') - new Date('2019-01-02'); // 86400000

new Date('2019-01-03') - new Date('2019-01-04'); // -86400000

// 日期比较
function compareDate (strDate1, strDate2) {
    var date1 = new Date(strDate1.replace(/\-/g, '\/'));
    var date2 = new Date(strDate2.replace(/\-/g, '\/'));
    
    return date1 - date2;
};

// 举例:
compareDate('2019-01-03', '2019-01-02') > 0; // true

compareDate('2019-01-03', '2019-01-04') < 0; // true

获取开始、结束时间间隔的具体日期,包括开始结束

function getIntervalDays (beginDate, endDate, formate) {
    var oneDayMilliseconds = 24 * 60 * 60 * 1000;
    var intervalDays = Math.abs(compareDate(beginDate, endDate)) / oneDayMilliseconds;
    
    var dates = [];
    for (var i = 0; i <= intervalDays; i++) {
        dates.push(getNewDateByDate(beginDate, i, formate));
    }
    
    return dates;
}

// 举例
getIntervalDays('2019-01-03', '2019-01-04'); // ["2019-01-03", "2019-01-04"]

getIntervalDays('2019-01-01', '2019-01-04'); // ["2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04"]
posted @ 2019-01-06 10:49  ESnail  阅读(395)  评论(0编辑  收藏  举报