关于日期计算,做个小笔记。
格式化
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"]