1. 程式人生 > >JS處理日期計算(按照年月日進行增減運算)

JS處理日期計算(按照年月日進行增減運算)

本分只簡單實現了增加 月份 和 天數 的功能,減法功能暫時沒做,讀者可以自己簡單實現。

年份的計算更簡單,只需要看增減後是否為閏年,如果是閏年的話看看月份是否為二月,如果為二月的話看看日期是否為合理並相應地調整即可。

天數的加減我看了網上的大部分方法都不是很完美,考慮的都比較少,我暫時只用到了增加天數的部分,就只寫了增加天數,這個版本減少天數會出現意想不到的結果,如有需要請評論。

為了方便我為String型別變數增加了endWith方法用來判斷字串結尾字元(M代表增減月份,Y代表增減年份,D代表增減天數)。

// 為String型別變數增加endWith方法用於判斷字串的結尾
String.prototype.endWith=function(endStr){
    var d=this.length-endStr.length;
    return (d>=0&&this.lastIndexOf(endStr)==d)
}
// 小於10的數字前加0
function formatSmallNum (num) {
    var newnum = parseInt(num);
    if (newnum<10) {		// 調整日小於10時的格式
        newnum = 0 + '' + newnum;
    }
    return newnum
}
var monthbs = [1,0,1,0,1,0,1,1,0,1,0,1]		// 定義月份的大小
// 處理加減月時,當日大於28時,將新的日在新的月份中合理化
function adjustNewDay (newyear, newmonth, newday) {
    var newAdjustedDay = newday;
    if (monthbs[newmonth-1]<1&&newday>28) {		// 將新的日在新的月份中合理化
        if (newmonth!=2) {							// 不是二月時
            newAdjustedDay = 30
        } else {
            if ((newyear % 4 == 0) && (newyear % 100 != 0 || newyear % 400 == 0)) {		// 二月時判斷是否為閏年
                newAdjustedDay = 29
            } else {
                newAdjustedDay = 28
            }
        }
    }
    return newAdjustedDay;
}
// 獲取當月份最大天數
function getMonthMaxDays (newyear, month) {
    var newmonthdays = 31;
    if (monthbs[month-1]<1) {
        if (month!=2) {
            newmonthdays = 30
        } else {
            if ((newyear % 4 == 0) && (newyear % 100 != 0 || newyear % 400 == 0)) {		// 二月時判斷是否為閏年
                newmonthdays = 29
            } else {
                newmonthdays = 28
            }
        }
    }
    return newmonthdays;
}
// 用來計算增減天數的遞迴
function recursionDays (year, month, day, delayTime) {
	console.log(year, month, day, delayTime)
	var newyear = year;
	var newmonth = month;
	var newday = day + delayTime;
	var newmonthdays = getMonthMaxDays(year, month);
	if(newday<=newmonthdays){
		newmonth = formatSmallNum(newmonth)
		newday = formatSmallNum(newday)
		return newyear + "" + newmonth + "" + newday
	} else {
		newmonthdays = getMonthMaxDays(year, month);	// 目標月最大天數
		newmonth = month + 1;
		newdelay = newday - newmonthdays;
		newday = 0;
		if (newmonth>12) {
			newyear = newyear + 1;
			newmonth = newmonth - 12;
		}
		return recursionDays(newyear, newmonth, newday, newdelay)
	}
}
// 日期計算
function addTime(date, delay) {
	var monthbs = [1,0,1,0,1,0,1,1,0,1,0,1]		// 定義月份的大小
	var year = parseInt(date.substring(0, 4));	// 獲取年
    var month = parseInt(date.substring(4, 6));	// 獲取月
    var day = parseInt(date.substring(6, 8));	// 獲取日
    if (delay.endWith("M")) {					// 處理月份加
    	delayTime = parseInt(delay.substring(0,delay.length-1))		// 獲取要加的月數
        var newyear = year
        var newmonth = month + delayTime;
        var newday = day;
	    if (newmonth > 12) {								// 月份加後大於12
	        var newyear = newyear + 1;
	        var newmonth = newmonth - 12;
	    }
	    newday = adjustNewDay(newyear, newmonth, newday);
	    newmonth = formatSmallNum(newmonth);
	    newday = formatSmallNum(newday);
	    var newdate = newyear + "" + newmonth + "" + newday;		// 組裝新日期
    }
    if (delay.endWith("D")) {					// 處理天數加
    	delayTime = parseInt(delay.substring(0,delay.length-1))		// 獲取要加的天數
    	var newdate = recursionDays(year,month,day,delayTime);		// 通過遞迴方式計算delayTime天后的日期
    }
    return newdate;
}

由於需求不同,讀者使用時應按照自己需要的格式調整返回值及具體細節。

在參考程式碼中 addTime 方法第一個引數傳入的日期應為 20180810 這種格式的日期,第二個引數應為 3M (三個月)、 15M (十五個月)、 5Y (五年)、 520D (五百二十天)等格式。且程式碼中的返回值格同樣為 20180810 這樣的格式。