2013-01-03 101 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(""); 
    } 
} 

我希望别人认为这有用!

相关问题