2015-06-10 72 views
0

我有一段代碼用於計算兩個Date對象之間的天數,在大多數情況下,它工作正常。 但是,如果兩個對象之間的日期範圍包括3月底,則結果總是比應該小1。例如2014年3月31日 - 2014年3月29日= 1,而應該是2.Java,如何在考慮DST時減去日期對象

據我所知,這是由於3月有30天24小時和1天23小時由於DST,這是價值的原因是1少。

但是,我不確定解釋失蹤小時的最佳方法。

// This was what I have initially 
    int numDays = (int) ((dateTo.getTime() - dateFrom.getTime())/(1000 * 60 * 60 * 24)); 

    // I have tried rounding, since it should have 23 hours left over, but it didn't actually work. 
    int numDays = (Math.round(dateTo.getTime() - dateFrom.getTime())/(1000 * 60 * 60 * 24)); 

任何幫助/指針將不勝感激。我不得不使用Java 7,但我不能使用Jodatime。

+5

如果您使用Java 8,請使用java.time包,而不是古老的'java.util.Date'。如果沒有,喬達時間是一個推薦的圖書館。 – RealSkeptic

+1

可能的重複http://stackoverflow.com/questions/20165564/calculating-days-between-two-dates-with-in-java – keuleJ

+1

那麼,如果你既不能使用Java-8(我刪除,因此我的帖子),也沒有另一個外部庫,那麼你真的運氣不好,因爲舊Java不支持計算持續時間。您必須設置自己的黑客,例如在[SO-post](http://stackoverflow.com/a/28865648/2491410)中提出的建議。 –

回答

1

你的第二個例子非常接近。但是,Math.round()的圓括號只包圍了減法,因爲這已經是一個整數(嗯,實際上是long),但沒有任何反應,然後就會分裂。你的第二個代碼的另一個問題是你正在做整數除法,它總是在小數點後面截斷部分。試試這個:

long numDays2 = Math.round((dateTo.getTime() - dateFrom.getTime())/(1000.0 * 60 * 60 * 24)); 

(如表所示,我改變了Math.round()括號,並使其通過使除數double浮點除法。)

正如評論指出,雖然,這是一個黑客。特別是,它會告訴你,3月5日上午6點到3月6日上午8點之間有兩天的時間。這可能不是你想要的。試試這個大小代替:

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(fmt.parse("2014-03-29")); 
    long start = cal.getTimeInMillis(); 
    start += cal.getTimeZone().getOffset(start); 
    cal.setTime(fmt.parse("2014-03-31")); 
    long end = cal.getTimeInMillis(); 
    end += cal.getTimeZone().getOffset(end); 

    System.out.println((end - start)/86400000.0); 

它是醜陋的?是。這是不是很奇怪?是。它工作嗎?是的,我想是這樣)。請注意,我提供了double作爲結果;您可以對此結果應用任何舍入。

+0

感謝您的幫助;非常感激。 –