JS處理日期計算(按照年月日進行增減運算)
阿新 • • 發佈:2019-01-03
本分只簡單實現了增加 月份 和 天數 的功能,減法功能暫時沒做,讀者可以自己簡單實現。
年份的計算更簡單,只需要看增減後是否為閏年,如果是閏年的話看看月份是否為二月,如果為二月的話看看日期是否為合理並相應地調整即可。
天數的加減我看了網上的大部分方法都不是很完美,考慮的都比較少,我暫時只用到了增加天數的部分,就只寫了增加天數,這個版本減少天數會出現意想不到的結果,如有需要請評論。
為了方便我為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 這樣的格式。