2009年,由於this post
答案通過@Zazerat我想出了一個解決方案。 @Jazerat提供了JSDate的減少版本,我可以輕鬆地在日期中調整月份。這裏是最終的代碼:
Date.isLeapYear = function (year) {
return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
};
Date.getDaysInMonth = function (year, month) {
return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
};
Date.prototype.isLeapYear = function() {
var y = this.getFullYear();
return (((y % 4 === 0) && (y % 100 !== 0)) || (y % 400 === 0));
};
Date.prototype.getDaysInMonth = function() {
return Date.getDaysInMonth(this.getFullYear(), this.getMonth());
};
Date.prototype.addMonths = function (value) {
var n = this.getDate();
this.setDate(1);
this.setMonth(this.getMonth() + value);
this.setDate(Math.min(n, this.getDaysInMonth()));
return this;
};
function daysInMonth(month,year) {
return new Date(year, month, 0).getDate();
}
function calculateLeasePeriod(){
var startDateValue=document.forms[0].StartDate.value;
var endDateValue=document.forms[0].EndDate.value;
if (endDateValue!="" && startDateValue!=""){
var startDateArray=startDateValue.split("/");
var endDateArray=endDateValue.split("/");
var startDate= new Date(startDateArray[2], startDateArray[1], startDateArray[0]);
var endDate= new Date(endDateArray[2], endDateArray[1], endDateArray[0]);
var diffYears = endDate.getFullYear()-startDate.getFullYear();
var diffMonths = endDate.getMonth()-startDate.getMonth();
var diffDays = endDate.getDate()-startDate.getDate();
var months = ((diffYears*12) + diffMonths);
if (diffDays<0){
months=months-1;
var adjStartDate = startDate.addMonths(months);
diffDays = endDate.getDate()-adjStartDate.getDate();
if (diffDays<0){
diffDays=daysInMonth(adjStartDate.getMonth(), adjStartDate.getYear())+ diffDays;
}
}
$("#PrimaryLeasePeriod").html(months + " months and " + diffDays + " days");
}else{
$("#PrimaryLeasePeriod").html("");
}
}
我希望別人認爲這有用!
請查看http://www.datejs.com/ –
對不起,但我認爲你對這個問題的處理方式有問題。你會遇到的一個問題是數月不一致。 1個月是什麼意思? 31天? 30? 28?這不會讓你有太大的精確度。也許你應該重新考慮你的方法,並質疑計算日期之間的月數是否有用/有必要。 – IsisCode