2013-02-17 113 views
2

我想查找两个日期之间的差异。为此,我从另一个Date对象中减去了一个Date对象。我的代码如下:javascript:计算两个日期之间的差异

var d1 = new Date(); //"now" 
var d2 = new Date(2012,3,17); // before one year 
document.write("</br>Currrent date : "+d1); 
document.write("</br>Other Date : "+d2); 
document.write("</br>Difference : "+new Date(Math.abs(d1-d2))); 

但结果并不如我所料:

Currrent日期:太阳2013年2月17日二时58分16秒格林尼治标准时间0500(EST)
其他日期:星期六2012年1月21日00:00:00 GMT-0500(EST)
差异:周四1971年1月28日21点58分16秒格林尼治标准时间0500(EST)

我要计算(1年)的区别它们之间。

感谢

+1

而你的计算结果必须是什么?天?秒?年份? – migg 2013-02-17 08:33:31

+0

我想计算自该日期以来的几天,几个月和几年... – mcacorner 2013-02-17 08:36:41

+0

然后它变得棘手:)所以你想要有“2年,5个月和23天以来的东西”......? – migg 2013-02-17 08:40:01

回答

3

所以从根本上最大的确切日期单位是一个周占7 * 86400秒。几个月和几年不是明确定义的。所以假设你想说如果两个日期是例如“1个月前” 5.1.20135.2.20135.2.20135.3.2013。如果你有例如“1个月和1天前” 5.1.20136.2.2013,那么你将不得不使用的计算是这样的:

// dateFrom and dateTo have to be "Date" instances, and to has to be later/bigger than from. 
 
function dateDiff(dateFrom, dateTo) { 
 
    var from = { 
 
    d: dateFrom.getDate(), 
 
    m: dateFrom.getMonth() + 1, 
 
    y: dateFrom.getFullYear() 
 
    }; 
 

 
    var to = { 
 
    d: dateTo.getDate(), 
 
    m: dateTo.getMonth() + 1, 
 
    y: dateTo.getFullYear() 
 
    }; 
 

 
    var daysFebruary = to.y % 4 != 0 || (to.y % 100 == 0 && to.y % 400 != 0)? 28 : 29; 
 
    var daysInMonths = [0, 31, daysFebruary, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
 

 
    if (to.d < from.d) { 
 
    to.d += daysInMonths[parseInt(to.m)]; 
 
    from.m += 1; 
 
    } 
 
    if (to.m < from.m) { 
 
    to.m += 12; 
 
    from.y += 1; 
 
    } 
 

 
    return { 
 
    days: to.d - from.d, 
 
    months: to.m - from.m, 
 
    years: to.y - from.y 
 
    }; 
 
} 
 
// Difference from 1 June 2016 to now 
 
console.log(dateDiff(new Date(2016,5,1), new Date()));

正如我所说的,它变得非常棘手;)

+0

Dude ..,它比必要的更大... – Exception 2013-02-17 11:47:22

+0

@Exception,什么是更简单的选择?鉴于闰年和可变天数,看起来尽可能小。 – SimplGy 2014-05-22 02:36:32

+0

@SimpleAsCouldBe看看我的答案 – Exception 2014-05-22 04:59:34

2

您是否在寻找this

Math.ceil((new Date(2012, 11, 23) - new Date(2012, 11, 21))/86400000) + 1 
+0

日期对象的差异是以毫秒为单位的差异。除数86400000'假设每年固定的天数,我认为这不是严格正确的。 – SimplGy 2014-05-22 05:33:13

+0

@SimpleAsCouldBe相当于一天86400000毫秒。所以逻辑正确 – Exception 2014-05-22 17:01:30

+0

有道理。所以这会计算几天。 OP目前尚不清楚,但他正在寻找“2年7个月22天”。这就是使问题具有挑战性的原因。 – SimplGy 2014-05-22 17:25:19

4

如果你需要相当准确的,我建议使用天为您的设备。年份有几个月可变的天数,所以说“1个月”或“1年”可能意味着不同的天数。

var d1 = new Date(); //"now" 
var d2 = new Date(2012,3,17); // before one year 
var msPerDay = 1000*60*60*24; 
document.write(((d1 - d2)/msPerDay).toFixed(0) + " days ago"); 
0

你在找这个?

Math.ceil((新的日期(2012,11,23) - 新的日期(2012,11,21))/ 864000)+ 1