2014-09-27 133 views
0

我们使用下面的代码。如何通过JavaScript计算两个日期之间的月份和日期?

var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds 
var firstDate = new Date(2008,01,12); 
var secondDate = new Date(2008,01,22); 

var diffDays = Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)); 

但我们无法在它们之间找到月份和日期。 我想假设开始日期是2014年9月27日,结束日期是2014年1月1日。结果将是1个月和5天。

+0

http://stackoverflow.com/questions/7763327/how-to-calculate-date-difference -in-javascript应该做你所需要的大概 – Rhumborl 2014-09-27 10:26:02

+0

我希望你知道01月是二月。 – Robert 2014-09-27 11:17:25

+0

是的。我有两个月的问题。 – krutssss 2014-09-29 06:44:23

回答

3

有多种方法来计算月和日。没有进一步限制,即使结果可能不同,所有纠正都是正确的。

例如从9月27日至11月一日可以是任一

  • 1个月和5天或
  • 4天,1个月。

这是一种可能的解决方案。

// swap dates if difference would be negative 
if (firstDate.getTime() > secondDate.getTime()) { 
    var tmp = firstDate; 
    firstDate = secondDate; 
    secondDate = tmp; 
} 

var years = secondDate.getFullYear() - firstDate.getFullYear(); 
var months = secondDate.getMonth() - firstDate.getMonth(); 
var days = secondDate.getDate() - firstDate.getDate(); 

// prevent negative amount of days by breaking up months 
for (var i = 0; days < 0; ++i) { 
    // while the day difference is negative 
    // we break up months into days, starting with the first 
    months -= 1; 
    days += new Date(
     firstDate.getFullYear(), 
     firstDate.getMonth() + 1 + i, 
     0, 0, 0, 0, 0 
    ).getDate(); 
} 

// prevent negative amount of months by breaking up years 
if (months < 0) { 
    years += Math.floor(months/12); 
    months = (months % 12 + 12) % 12; 
} 

// print the result 
console.log([ 
    {amount: days, unit: 'day'}, 
    {amount: months, unit: 'month'}, 
    {amount: years, unit: 'year'}, 
].filter(value => value.amount).map(value => 
    value.amount === 1 ? 
     `${value.amount} ${value.unit}` : 
     `${value.amount} ${value.unit}s` 
).reduce((result, part, index, parts) => 
    index > 0 ? index === parts.length - 1 ? 
     `${result} and ${part}` : 
     `${result}, ${part}` : 
     `${part}`, 
     `0 days` 
)); 

实例:

  • 02/12至02/22:10天
  • 09/27 11/01到:1天1个月//而不是1个月和5天
  • 12/31 03/01到:每日1 2个月//而不是1个月和29天
  • 5月31日至06/30:30天
  • 1月31日至03/30:30天和1个月//而不是1个月和27个月天
  • 10/27/2010至2014年8月26日:30天9个月至3年
+1

使用2013-12-31和2014-03-01给2个月和-2天。 – RobG 2014-09-27 11:59:27

+0

@RobG谢谢你的提示。将两个日期的距离分解为几天和几个月是有点模糊的。显然,我的第一种方法(首先计算几个月,然后几天)有一些特别的情况,尽管我认为大多数人会以这种方式手动进行。我已经更改了代码,现在它首先计算几天,然后几个月。这应该解决所有问题,但仍然没有错误。 – Robert 2014-09-27 12:29:33

+0

有很多“特例”,这并不容易。现在2014-05-31至2014-06-30给30天,应该是1个月吗?通常也有行政规则,例如在某些司法管辖区,2月29日出生的人在2月28日的非闰年生日,但在其他司法辖区则是3月1日。是6月30日+1月30日或7月31日?增加和减去年份和月份也不一定是对称的。一切都很好玩。 ;-) – RobG 2014-09-27 12:36:09

1

试试这个

var oneDay = 24*60*60*1000; 
 
    var firstDate = new Date(2007,01,12); 
 
    var secondDate = new Date(2008,01,22); 
 

 
    var diffDays = Math.abs((firstDate.getTime() - secondDate.getTime())); 
 

 
    var result = '', 
 
     years, months, days; 
 
    if((years = diffDays/(365 * oneDay)) > 1){ 
 
     result += Math.floor(years) + ' Year(s)'; 
 
     diffDays %= (365 * oneDay); 
 
    } 
 
    if((months = diffDays/(30 * oneDay)) > 1){ 
 
     result += Math.floor(months) + ' Month(s)'; 
 
     diffDays %= (30 * oneDay); 
 
    } 
 
    result += (diffDays/oneDay) + ' Days(s)'; 
 
    alert(result);

+0

不适用于'var firstDate = new Date(2010,09,27); var secondDate = new Date(2014,07,26);'。退货4天 – Rhumborl 2014-09-27 10:43:19

+0

否3年10个月4天 – MH2K9 2014-09-27 10:45:13

+0

恰好26-27不是4应该约30 – Rhumborl 2014-09-27 10:46:54

相关问题