这个在js时间操作(一)里面描述的清楚了,就不多说了,直接上代码,在(一)的基础上增加了几个扩展方法,日期的加减操作,代码如下:
(function(w) {
var add0 = function(inputIntValue) {
if (inputIntValue < 10) {
inputIntValue = "0" + inputIntValue;
//因 月 日 时 分 秒 会存在只有个位数字,这样加0稍微美观一点
//用2000-01-01 01:02:02 不会出现 2000-1-1 1:2:2
}
return inputIntValue;
};
w.dateTool = {
prettyDateString: function(inputDateString, dateType) {
if (inputDateString == undefined || inputDateString == null || inputDateString == '') {
inputDateString = new Date(); //空值则取当前时间
}
inputDateString = new Date(inputDateString);
if (inputDateString == "Invalid Date") { //对时间扩展new Date().toPrettyDateString("yyyy-MM-dd")这里没关系,不会有问题
inputDateString = new Date(); //但是如果直接用prettyDateString("sdfg")作为函数使用可以对他进行判断验证
}
var year = inputDateString.getFullYear();
var month = add0(inputDateString.getMonth() + 1); //month从0开始记所以加1
var day = add0(inputDateString.getDate());
var hour = add0(inputDateString.getHours());
var minute = add0(inputDateString.getMinutes());
var second = add0(inputDateString.getSeconds());
var result = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
if (dateType == null) {
return result;
};
if(typeof dateType!="string"){
dateType=dateType+"";
}
result = dateType.replace(/y{1,4}/, year).replace(/M{1,2}/, month).replace(/d{1,2}/, day).replace(/h{1,2}/, hour).replace(/m{1,2}/, minute).replace(/s{1,2}/, second);
return result;
},
addYear: function(date, count) { //日期年的加减 count正为加,负为减
var result = new Date(date);
result.setFullYear(result.getFullYear() + parseInt(count));
return result;
},
addMonth: function(date, count) { //月的加减
var result = new Date(date);
var sourceDate = result.getDate();
result.setMonth(result.getMonth() + parseInt(count));
if (result.getDate() < sourceDate) {
result.setMonth(result.getMonth());
result.setDate(0);
}
return result;
},
addDay: function(date, count) { //日的加减
var result = new Date(date);
result.setDate(result.getDate() + parseInt(count));
return result;
},
addHour: function(date, count) { //小时加减
var result = new Date(date);
result.setHours(result.getHours() + parseInt(count));
return result;
},
addMinute: function(date, count) { //分钟加减
var result = new Date(date);
result.setMinutes(result.getMinutes() + parseInt(count));
return result;
},
addSecond: function(date, count) { //秒数加减
var result = new Date(date);
result.setSeconds(result.getSeconds() + parseInt(count));
return result;
}
};
Date.prototype.toPrettyDateString = function(dateType) { //时间扩展方法
return dateTool.prettyDateString(this, dateType);
};
Date.prototype.addYear = function(count) { //扩展加减年
return dateTool.addYear(this, count);
};
Date.prototype.addMonth = function(count) {//扩展加减月
return dateTool.addMonth(this, count);
};
Date.prototype.addDay = function(count) {//扩展加减天
return dateTool.addDay(this, count);
};
Date.prototype.addHour = function(count) {//扩展加减小时
return dateTool.addHour(this, count);
};
Date.prototype.addMinute = function(count) {//扩展加减分钟
return dateTool.addMinute(this, count);
};
Date.prototype.addSecond = function(count) {//扩展加减秒
return dateTool.addSecond(this, count);
};
})(window);
这里值得特别注意的是那个月的加减,js的日期设置当月的天数小于尾数的天数的时候,他会默认以30天处理,
例如: 2016-07-31 12:12:12
var datestr = new Date("2016-07-31 12:12:12");
var result = new Date(datestr);
var sourceDate = result.getDate();
result.setMonth(result.getMonth() -5); //直接加减月错误,错误操作
console.log("---------------------------------")
console.log(result.toPrettyDateString("yyyy-MM-dd hh:mm:ss")); //错误结果
console.log(datestr.addMonth(-5).toPrettyDateString())//正确结果
console.log("---------------------------------")
结果如下:
---------------------------------
2016-03-02 12:12:12 //错误结果
2016-02-29 12:12:12 //正确结果
---------------------------------
直接对月进行加减,当出现结果月的天数(结果月16年2月有29天)小于起始时间的天数(起始源时间2016-07-31 12:12:12天数是31)的时候,当减去31天的时候,他会发现多减了,然后就加上31-29=2天,就出现了错误的结果2016-03-02 12:12:12 ,因此,要把错误时间修正过来,所以增加了对月的时间的判断,如下所示:
addMonth: function(date, count) { //月的加减
var result = new Date(date);
var sourceDate = result.getDate();
result.setMonth(result.getMonth() + parseInt(count));
if (result.getDate() < sourceDate) {
result.setMonth(result.getMonth());
result.setDate(0);
}
return result;
}
判断月的天数小于起始的天数,然后就取前一个月的最后一天,这才是正确的加减月的结果。
好了,结束了,有什么不对或者需要优化的地方还请批评指出,我会尽快改正,谢谢!