js日期处理---计算自然月、指定自然月某一天、获取前一天和后一天、判断闰年、当月最后一天日期、月末最后一天

最近被日期弄得很头疼,由于js的月份是比较特殊的[0-11],所以在月份计算上诸多不易。特地整理了日期一些方法。

首先,以下代码均有一个共同的日期格式化函数

//日期格式化
Date.prototype.format = 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()
	// millisecond
	}

	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] : ("00" + o[k]).substr(("" + o[k]).length));
	return format;
}

但是出现了一个很烦人的事情,就是js 在日期不满足的情况下就会自动加1个月,比如在当前时间为3月31号,传入1,1两个参数,预期结果为2月29日,但是结果输出了3月2日。就是如果不满就会溢出到下个月,后来看了api发现了setMonth有两个方法,另外一个是指定月份,指定某一天,就可以解决这个问题,并延伸了两个方法。

1.求自然月

我在网上查询到查询三个月前的方法,参照点击打开链接http://wawa129.iteye.com/blog/1766263,进行改造,js代码如下。

//求自然月日期
function getMonthBefore(timeType, num) {
	var date = new Date();
	var retureValue = "";
	if (timeType == 1) {
		date.setMonth(date.getMonth() - (num - 1));
		//format为日期格式化函数,在下方展示
		retureValue = date.format('yyyy-MM');
	}
	if (timeType == 0) {
		date.setMonth(date.getMonth() - (num - 1));
		retureValue = date.format('yyyy-MM-01');
	}
	return retureValue;
}

//求自然月日期
function getMonthBefore(timeType, num) {
	var date = new Date();
	var retureValue = "";
	//如果输入1至输出到月
	if (timeType == 1) {
		date.setMonth(date.getMonth() - (num ),1);
		retureValue = date.format('yyyy-MM');
	}
	if (timeType == 0) {
		date.setMonth(date.getMonth() - (num ),1);
		retureValue = date.format('yyyy-MM-01');
	}
	// alert(retureValue);
	return retureValue;
}
//求自然月日期,添加日期格式化符号
function getMonthBeforeFormat(timeType, num,format) {
	var date = new Date();
	var retureValue = "";
	if (timeType == 1) {
		date.setMonth(date.getMonth() - (num ),1);
		retureValue = date.format('yyyy'+format+'MM');
	}
	if (timeType == 0) {
		date.setMonth(date.getMonth() - (num ),1);
		retureValue = date.format('yyyy'+format+'MM'+format+'01');
	}
	return retureValue;
}
//求自然月日期,添加日期格式化符号,指定某一天
function getMonthBeforeFormatAndDay(timeType, num,format,day) {
    var date = new Date();
    var retureValue = "";
    if (timeType == 1) {
        date.setMonth(date.getMonth() - (num ),1);
        retureValue = date.format('yyyy'+format+'MM');
    }
    if (timeType == 0) {
        date.setMonth(date.getMonth() - (num ),1);
        //读取日期自动会减一,所以要加一
        var mo=date.getMonth()+1;
        //判断如果傻叉的非得传某一天大于月份最大日期就自动赋值最后一天
        if(mo==4||mo==6||mo==9||mo==11){
            if(day>30){
                day=30
            }
        }else if(mo==2){
           if( isLeapYear(date.getFullYear())){
               if(day>29){
                   day=29
               }else{
                   day=28
               }
           }
        }else{
            if(day>31){
                day=31
            }
        }
        retureValue = date.format('yyyy'+format+'MM'+format+day);
    }
    return retureValue;
}

2.获取月末

有两种方法

//获取当月最后一天日期  
function getLastDay(year,month) {         
var new_year = year;    //取当前的年份          
var new_month = month++;//取下一个月的第一天,方便计算(最后一天不固定)          
if(month>12) {         
new_month -=12;        //月份减          
new_year++;            //年份增          
}         
var new_date = new Date(new_year,new_month,1);                //取当年当月中的第一天          
return (new Date(new_date.getTime()-1000*60*60*24)).getDate();//获取当月最后一天日期          
}  

/**求月末 yyyy-mm-dd
 * 
 * @param _month
 * @returns
 */
function getMonthEndDay(_month) {
    var date = new Date();
    var day=01;
    var year1 =  _month.substr(0,4);
    var month1 = _month.substr(5,2);
    date.setYear(year1);
        date.setMonth(month1-1);
        //读取日期自动回减一
        var mo=date.getMonth()+1;
        if(mo==4||mo==6||mo==9||mo==11){
                day=30
        }else if(mo==2){
            if( isLeapYear(date.getFullYear())){
                    day=29
            }else{
                day=28
            }
        }else{
                day=31
        }
    date.setDate(parseInt(day));
    return  date.format('yyyy-MM-dd');
}
3.获取前后天数

function GetDateStr(AddDayCount) {
    var dd = new Date();
    dd.setDate(dd.getDate()+AddDayCount);//获取AddDayCount天后的日期
    var y = dd.getFullYear();
    var m = dd.getMonth()+1;//获取当前月份的日期
    var d = dd.getDate();
    return dd.format('yyyy-MM-dd');
}

4.获取当前日期YYYY MM DD

//获取当前日期YYYY MM DD
function getNowDate(format) {
	var now = new Date()
	y = now.getFullYear()
	m = now.getMonth() + 1
	d = now.getDate()
	m = m < 10 ? "0" + m : m
	d = d < 10 ? "0" + d : d
	return y + format + m + format + d
}
5.判断是否为闰年

//JS判断闰年代码
function isLeapYear (Year) {
    if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
        return (true);
    } else { return (false); }
}

代码均做了基本的测试,刚开始写博客,如果出现bug的请多多指教,也希望大家如果有好的处理日期的代码也能共享!谢谢大家!




你可能感兴趣的:(js)