2013-02-17 184 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

相關問題