2013-01-03 170 views
1

我想知道是否有人有JavaScript函數來返回2個日期之間的月份和天數?例如,如果通過01/01/2013和03/01/2015(英國日期格式),它將返回24個月2天。我有幾個月的時間,但我正在爲這件日子苦苦掙扎。在我的表單上有2個日期字段,格式爲dd/mm/yyyy。這裏的代碼,我到目前爲止:Javascript月和日期之間的日期

function calculateDateDifference(){ 
var startDateValue=document.forms[0].StartDate.value; 
var endDateValue=document.forms[0].EndDate.value; 

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; 
    } 
alert(months + " months"); 
} 

在此先感謝, 尼爾。

+0

請查看http://www.datejs.com/ –

+0

對不起,但我認爲你對這個問題的處理方式有問題。你會遇到的一個問題是數月不一致。 1個月是什麼意思? 31天? 30? 28?這不會讓你有太大的精確度。也許你應該重新考慮你的方法,並質疑計算日期之間的月數是否有用/有必要。 – IsisCode

回答

0

此函數將計算英國(小尾數)格式中兩個日期之間的天數。

​function subtractDates(firstDate, secondDate){ 
     var fdObj, sdObj; 
     firstDate = littleToMiddleEndian(firstDate); 
     secondDate = littleToMiddleEndian(secondDate); 
     function littleToMiddleEndian(led){ 
      var a = led.split("/") 
      return [a[1],a[0],a[2]].join("-"); 
     } 
     fdObj = new Date(firstDate); 
     sdObj = new Date(secondDate); 
     return sdObj-fdObj/86400000; 
    } 
    var daysBetween = subtractDates("10/01/12","17/01/12"); 
    console.log(daysBetween); 

首先,它使用一個內部函數從小endian格式(DD-MM-YY)的日期轉換爲通過Date對象所需的中間endian格式(MM-DD-YY)。然後它創建兩個Date對象並從另一箇中減去另一個,然後除以86400000(一天中的毫秒數),其結果爲表示兩個日期之間的天數的整數。

+0

謝謝@IsisCode。我已經添加了我的代碼到目前爲止,並有一些monthe非常相似。我現在正忙於工作 – nelsie

+0

Date構造函數根本不需要「中間格式」。在ES5之前,字符串的解析依賴於實現。爲ECMA-262指定的唯一字符串格式是[ISO8601長格式](http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15)的一個版本。由於您將日期分成它的組件,最好使用這些部分:'返回新日期(a [2], - a [1],a0)'以獲得符合標準的跨瀏覽器功能,而不是取決於瀏覽器的怪癖。 – RobG

0

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(""); 
    } 
} 

我希望別人認爲這有用!

相關問題