2009-05-11 25 views
6

Javaクラスを探しています。ここでは、「毎週日曜日」や「毎週月曜日の最初の発生」などの日付ルールのセットを指定できます月"。私はそれから無限の反復子のようなものを得ることができるようにしたい(.next()はルールセットに一致する次の日付を返します)。Java日付反復子ファクトリ、間隔の計算方法を指定する

私はそれを自分で作ることができると思いますが、カレンダーは面倒です。すでに類似したものがあるはずです。私はよりクレイジーな車輪を再発明するものが嫌いです。

誰もがこのようなことを認識していますか?私はJODAを見てきましたが、それはその基礎を築いているようですが、私が望むすべての機能を提供するようには見えません。

答えて

7

joda-timeまたはJava用のイテレータは、その点についてはCalendar APIを使用していますが、jodaを使用すると簡単に行えます。例えばジョダで自分自身を再習熟後数ヶ月の一時停止した後、私は約10分でこれを作った:

public class InstantIterator implements Iterator<Instant>, 
             Iterable<Instant> { 

    private Instant current; 
    private final Instant original; 
    private Duration skip; 
    private List<Instant> skipThese; 

    public InstantIterator(Instant startFrom, Duration skip) { 
     this.current = original = startFrom; 
     this.skip = skip; 
     skipThese = new Vector<Instant>(); 
    } 

    public boolean hasNext() { 
     return true; 
    } 

    public Instant next() { 
     Instant currentNext = current.toInstant(); 
     current = current.plus(skip); 
     while (skipThese.contains(currentNext)) { 
      currentNext = current.toInstant(); 
      current = current.plus(skip); 
     } 
     return currentNext; 
    } 

    public void remove() { 
     skipThese.add(current.toInstant()); 
    } 

    public Iterator<Instant> iterator() { 
     return this; 
    } 

    public void rewind() { 
     current = original.toInstant(); 
    } 

    public void resetRemoved() { 
     skipThese.clear(); 
    } 

    public void resetIterator() { 
     rewind(); 
     resetRemoved(); 
    } 
} 

+0

あなたは私の午後を揺るがしました - ありがとうございました! –

+0

重要ではありませんが、これはremove()をサポートする2番目のイテレータであると言いたいのですが、通常はサポートするのが面倒です。 – Esko

0

私の会社はsomething very much like you wantを持っていますが、それはとても.NETのためだ:-)ジョダ時間は素晴らしいですそれはおそらくあなたに良いことをしません。

0

ジョブスケジューリング用に設計されたQuartzをご覧ください。

0

TL; DR

簡単、java.timeと。第三木曜日のために

:ジャワの最も初期のバージョンに同梱

LocalDate.now().with(           // Get today's date, then adjust. 
    TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.THURSDAY) // Define adjuster to move to third Thursday of same month. 
)                 // Instantiates another `LocalDate` object (java.time uses immutable objects). 

java.time

面倒古い日時のクラスは今java.timeクラスに取って代わられ、廃止されました。

LocalDateクラスは、タイムゾーンのない時間帯のない日付のみの値を表します。任意のLocalDateについては

LocalDate ld = LocalDate.of(2018 , Month.FEBRUARY , 17) ; 

、あなたは同じ月内の曜日の順序発生に調整することができます(例:第三木曜日、第二火曜日、など)。曜日をDayOfWeek列挙型で指定します。

調整するには、TemporalAdjustersクラスにあるTemporalAdjusterの実装を使用します。

TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​(3 , DayOfWeek.THURSDAY) ; // Third-Thursday. 

LocalDateのオブジェクトを生成する、任意のLocalDateにその調整を適用します。それのうち無限イテレータのような

LocalDate thirdThursday = ld.with(thirdThursdayAdjuster) ; 

何かが(.next()単純に別のLocalDateから移動

に一致する次の日付を返します。あなたはLocalDate::addMonthsを呼び出すことができます。または一度に1か月を扱う場合は、YearMonthクラスを使用してください。

TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​(3 , DayOfWeek.THURSDAY) ; // Third-Thursday. 
List<LocalDate> dozenThirdThursdays = new ArrayList<>(12) ; 
YearMonth start = YearMonth.of(2018 , Month.MARCH) ; 
for(int i = 1 ; i <= 12 ; i ++) { 
    YearMonth ym = start.plusMonths(i) ; 
    LocalDate firstOfMonth = ym.atDay(1) ; 
    LocalDate thirdThursday = firstOfMonth.with(thirdThursdayAdjuster) ; 
    dozenThirdThursdays.add(thirdThursday) ; 
} 

java.timeについて

java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなどの面倒な古いlegacy日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8Java SE 9、以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6Java SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • java.timeクラスのAndroidのバンドル実装以降のバージョン。
    • 以前のAndroidの場合、ThreeTenABPプロジェクトはThreeTen-Backport(上記)に適合しています。 How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題