日期相關的一些簡單計算:格式化,上個月,前一天
阿新 • • 發佈:2019-01-06
關於日期計算,做個小筆記。
格式化
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"]