2016-08-30 41 views
1

要計算兩個日期(日期或日曆對象)之間的日期,還要考慮計算的結束日期。考慮結束日期也用於java中的天計算邏輯

我用以下方法:

public static int daysBetween(Date d1, Date d2) {  
return Days.daysBetween(new LocalDate(d1.getTime()), new LocalDate(d2.getTime())).getDays();  
} 

例如

Date d1 = new Date(); // 30-08-2016 
Calendar c= Calendar.getInstance(); 
c.add(Calendar.YEAR, 2016); 
c.add(Calendar.MONTH, Calendar.AUGUST); 
c.add(Calendar.DAY_OF_MONTH, 31)// 31-08-2016 
Date d2 = c.getTime(); 

daysBetween(D2,D1);

該方法返回「1」,但我想爲「2」,因爲我需要考慮的結束日期也意味着30和31

對於那些要求我可以添加+1不管這方法返回或之前還返回值。這不是解決問題的正確方法,也需要考慮閏年日期。

請幫我解決問題。

+0

對於你*不*問的技術術語是'半開放',其中時間跨度被定義爲開始*包含*而結束*是*排除*。 * *要求的是「關閉」,開始和結束都包含在內。半開放式方法通常被使用,並且更加合理和實用。一致使用時,Half-Open使日期時間處理邏輯更清晰,更清晰,更簡單。如果您的要求要求封閉號碼,只需添加一個就是正確的解決方案,除了零計數(您需要根據需求思考和制定)。 –

+0

@BasilBourque一般來說,半開放是好的,因爲它有助於處理那些實際使用的潛在更精確單位的時間間隔,但對於日期間隔來說情況不同,因爲單位的日子已經是最小的單位。像往常一樣在銀行和保證領域,在這個領域工作的人(像我一樣)使用截止日期間隔(例如一個整月通常被建模爲封閉範圍[2016-08-01/2016-08-31],好處不要顯示另一個月而不是像[2016-08-01/2016-09-01) –

回答

2

我不會混淆兩個不同的庫,這裏Joda-Time和java.util.Calendar/Date

Days.daysBetween(LocalDate.now(), new LocalDate(2016, 8, 31)).getDays(); // 30 

這會自動考慮飛躍天,如果你希望將結果添加到原來的日期是正確的:與其在今天和八月底之間的天的時間可以在喬達時這樣評價達到結束日期。但是:

關閉日期間隔的長度與添加所需的已用天數不同。對於這種情況,您只需添加一天來確定開始和結束之間的長度。例如,八月有[2016-08-31] - [2016-08-01] + 1 = 31 - 1 + 1 = 31天,但您只需要在8月的第一天增加30天就可以獲得8月底。一天的差異是非常自然的,並且是由於關於長度(關閉間隔)與在中需要的持續時間有關的不同概念。

增加一天持續時間以達到長度沒有任何問題。

+0

謝謝梅諾,我也會這樣做。 – pandiaraj

相關問題