2017-03-22 167 views
1

東西似乎不正確,我只是不知道我可以如何解決它。不同的時間間隔util.date和DAYS.between(本地時間)

我想知道2日期之間的天數差異。現在我實現了一個功能,它計算到天,從毫秒的差異爲util.date對象

public long calculateNumberOfDays(Date from, Date to) { 
    return (to.getTime() - from.getTime())/(1000*60*60*24); 
} 

我的JUnit測試告訴我,有這個功能的錯誤,所以我重寫它使用LOCALDATE的和ChronoUnit。 DAYS.between函數。它像一個魅力。

想知道什麼這兩個函數之間的差異,我寫了這個小測試:

for(int numberDays = 1; numberDays<10; numberDays++){ 
     LocalDate fromLD = LocalDate.now(); 
     LocalDate toLD = fromLD.plusDays(numberDays); 
     Date fromD = Date.valueOf(fromLD); 
     Date toD = Date.valueOf(toLD); 
     long diffMS = toD.getTime() - fromD.getTime(); 
     double diffDays = diffMS/(1000*60*60*24); 
     long numDaysDate = DAYS.between(fromLD, toLD); 
     System.out.println(numberDays+" = "+diffDays+"/"+numDaysDate); 
} 

它帶來了以下的輸出:

1 = 1.0/1 
2 = 2.0/2 
3 = 3.0/3 
4 = 4.0/4 
5 = 4.0/5 
6 = 5.0/6 
7 = 6.0/7 
8 = 7.0/8 
9 = 8.0/9 

能有人向我解釋,如何這個有可能? (1-4它工作,5-9 util.date已經損失了一天)

+0

貌似夏令時間即將開始.... –

+0

我沒有知道今年我們節省了一整天的時間:P – Nexxurs

+0

我已經給出了答案,但整數(或長整數)的部分向下舍入 –

回答

3

日期很難。 java Date是日期和時間,所以當您將其設置爲實際日期時,意味着該日期是午夜。

夏令時現在在任何一天(至少在這裏)踢球,所以週一的午夜將在週日午夜23點後。

除以整數向下舍入,所以4天小時和23小時是4天

鑄造一個整數除法爲雙的結果是太晚;你需要轉換的輸入一個或兩個:

double diffDays = diffMS/(1000*60*60*24); 

4.0

double diffDays = diffMS/(1000.0*60*60*24); 

4.958333 ......

+0

您是對的,謝謝。我想我已經通過使diffDays成爲雙重價值來覆蓋它。當我將diffMS解析爲double然後分割時,會生成正確的double值。 – Nexxurs

+0

當我說日期很難,我的意思是*可笑*很難做日期/時間操作而不會觸及這類錯誤。有一個原因java 8包含第三次嘗試(在java.util.Date和java.util.Calendar之後)以提供工具。你很幸運,你在DST之前一週測試了這個。 –

相關問題