1. 程式人生 > >日期相關的一些簡單計算:格式化,上個月,前一天

日期相關的一些簡單計算:格式化,上個月,前一天

關於日期計算,做個小筆記。

格式化

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"]