2013-10-18 96 views
0

假設我有一些賬單有一些開始日期和結束日期。比較日期期間和日期期限長度

Mar 10 to Apr 9 
Apr 10 to May 9 
May 10 to Jun 9 

,我要檢查的業務規則是

for any given bill, the previous bill is exactly one period behind

因此,例如,3月10日至4月9日是一個月左右分開,所以我用它來檢查任何連續兩個賬單開始日期(4月10日和3月10日)大約相隔一個月。

現在我遇到的問題是獲取期間的長度。例如,假設我有以下數據集

Jan 1 to Jan 31 
Feb 1 to Feb 28 
Mar 1 to Mar 31 

我使用JodaTime庫,所以我說像

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy"); 
DateTime date1 = formatter.parseDateTime("01/01/2013"); 
DateTime date2 = formatter.parseDateTime("31/01/2013"); 
System.out.println(Months.monthsBetween(date1, date2).toPeriod().getMonths()); 

而返回0,這是正確的,但不實用。

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy"); 
DateTime date1 = formatter.parseDateTime("31/01/2013"); 
DateTime date2 = formatter.parseDateTime("01/02/2013"); 
System.out.println(Months.monthsBetween(date1, date2).toPeriod().getMonths()); 

而且即使是相隔一天,它也會返回1。

什麼是更好的方法來做到這一點?我可以查看幾天的差異,但由於結算週期以月爲單位,我希望任何輸出都一致(例如:這些賬單不相隔x個月等)

+0

那麼沒有一天沒有結帳的條件呢?什麼是'toPeriod()'? – clwhisk

+0

@clwhisk抱歉,你能提供一個你的意思嗎? – MxyL

+0

我想我明白你的意思。例如,如果一個時期是1月1日到1月25日,下一個時期是2月1日到2月25日,並且它們仍然是「有效」的,因爲中間的失蹤日期不計算在內。 – MxyL

回答

1

爲什麼不只是檢查一個週期的開始日期減去一天等於上一個期間的結束日期?

LocalDate endDate1, startDate2... 

startDate2.minusDays(1).equals(endDate1) 
+0

哦,這將解決問題,假設所有賬單期間一致。 – MxyL

1

Interval

如果您切換到使用特定時刻(DateTime對象),而不是LocalDate對象,你可以使用Interval類跟蹤的時間跨度與啓動和停止的時刻。小費,如果你走這條路:DateTime::withTimeAtStartOfDay方法。

Interval類有方便的比較方法,例如abutsgapoverlaps,和contains。第一個,abuts,就是你要找的。

如果你想堅持LocalDate對象,你可以建立自己的小DateRange類的行爲類似於Interval行爲。您甚至可以在Stack Overflow上找到一些示例代碼。

順便說一下,Joda-Time項目現在處於維護模式,團隊建議遷移到java.time類。 java.time類由ThreeTen-Extra項目擴展。該項目提供類似於Joda-Time IntervalInterval類。