2010-12-08 59 views
28

Joda時間有Interval級別,該級別介於DateTime之間。什麼可以用於LocalDate s的範圍?Joda時間的LocalDate間隔

我想要一個代表「2011年1月1日至2011年10月1日」之類的對象,而沒有時間(或時區)進入圖片。

據我所知,喬達時間沒有內置任何東西。 如果它沒有任何東西,我們會創建它,它應該是什麼樣子?最重要的是,哪些接口可以實現最佳集成到其他類型,並保持與喬達時間設計一致? 它是否有意義實施ReadableInterval,其中getStartgetEnd返回DateMidnight

回答

14

Interval類表示從一毫秒的瞬間到另一瞬間(完成時區)的時間間隔。 DateMidnight就是這樣一個瞬間。因此,您提議的DateMidnights時間間隔的實現已經準備就緒。

Interval i = new Interval(
    new DateMidnight(2010, 3, 2), new DateMidnight(2010, 3, 5)); 

i.contains(new DateTime(2010, 3, 1, 23, 59, 59, 999)); // == false 
i.contains(new DateTime(2010, 3, 2, 0, 0, 0, 0)); // == true 
i.contains(new DateTime(2010, 3, 4, 23, 59, 59, 999)); // == true 
i.contains(new DateTime(2010, 3, 5, 0, 0, 0, 0)); // == false 

但是您所查找的時間間隔爲LocalDates又名一個部分(不同時區)的概念還不存在。如果您要爲自己實現它,請不要實現任何間隔接口。它會干擾你的願望,因爲如前所述,它是基於瞬間的。

7

編輯:哎呀,誤讀之前。

不,我沒有意識到喬達時代的任何東西。

就我個人而言,我只是創建自己的課程,其中包括開始和結束日期:LocalDateInterval或類似的東西。因爲它會混淆概念:一對LocalDate不代表代表兩個瞬間,因爲本地日期並不是真正的瞬間。

我個人沒有找到Interval在喬達時間特別有用...我一直在考慮從野田時間中刪除它。現在聽起來像我不應該;)

+0

但我需要的不是持續時間,而是一個特定的時間間隔。例如:2011年1月1日至2012年1月10日。我將編輯該問題以澄清 – 2010-12-08 12:57:18

+0

Doh,對不起,我現在和你在一起。 – 2010-12-08 12:57:54

+0

什麼是野田時間?那是Jon Skeet的個人日期時間圖書館嗎? – 2010-12-08 13:14:59

4

請注意,使用DateMidnight將在DST交換機上失敗。最好使用date.toDateTimeAtStartOfDay()進行轉換。

2

我也需要LocalDate對象的間隔,但它不受JodaTime支持。 所以我不得不創建我自己的實現。後來我決定擦亮一下,然後開源。

你可以查看:https://github.com/serddmitry/joda-interval(Maven Central提供)。

24

我personnaly使用從Guava的Range類。

它支持開放式範圍。也可以指定包含或排除的邊界。除了其他許多可能性之外,這些可以容易地表示「在日期之前」或「在日期之後」。

開放式間隔的示例。

Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31")); 
Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01")); 

它也容易測試謂詞,如contains和containsAll,以及一個交集操作。所有這些測試和維護。

1
public class LocalDateInterval { 

    private LocalDate begin; 
    private LocalDate end; 

    public LocalDateInterval(LocalDate begin, LocalDate end) { 
    this.begin = begin; 
    this.end = end; 
    } 



} 

這對我有用。