2016-03-22 21 views
5

ISOの日付関連の用語をここで混同している場合、事前にお詫び申し上げます。1年にJava 8で毎週繰り返すことができますか?

私は、毎週、指定された年(2015年)に繰り返し処理できるようにしたいと考えています。 2015年1月1日から2015年12月31日までの週数を計算できますが、それは1週間のISO標準に準拠していません。むしろ、2つの日付の間に7日間の期間を与えます。 1年目のISO週は、必ずしも2015年1月1日に開始されるわけではありません。

最初の週の最初の日付を取得できる場合は、ZonedDateTime.plusWeeks(1)で52週間反復することができます。あなたは、フィールドアクセサ経由任意日付の週番号を取得することができます。

ZonedDateTime date = ZonedDateTime.now(); 
WeekFields weekFields = WeekFields.of(Locale.getDefault()); 
int weekNumber = date.get(weekFields.weekOfWeekBasedYear()); 

はこのことを考えると、私は特定のの最初の週の最初の日の日付を取得することが可能でなければならないと思います Java 8 Time APIの年ではありますが、私はまだそれを行う方法を見つけていません。あなたが日付を作成し、次に年の最初の週の週の最初の日にそれを調整することができ

+0

別のライブラリでISO-week-dateを作成するには、[my examples](http://time4j.net/tutorial/appendix.html#x14)も参照してください。 JSR-310(java.time-package)は単純なファクトリメソッドを欠いているので、 'java.util.GregorianCalendar'を使った古いJDKももっとシンプルです。 –

答えて

4

JodaStephenさんのコメントに

int year = 2016; 
WeekFields weekFields = WeekFields.ISO; 
LocalDate date = LocalDate.now().with(weekFields.weekBasedYear(), year) 
           .with(weekFields.weekOfWeekBasedYear(), 1) 
           .with(ChronoField.DAY_OF_WEEK, 1); 

おかげで、それを置くための別の方法は次のようになりますIsoFieldsクラスを使用します。

LocalDate date = LocalDate.now().with(IsoFields.WEEK_BASED_YEAR, year) 
           .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 1) 
           .with(ChronoField.DAY_OF_WEEK, 1); 

WeekFields.ISOは、週のISOの定義を表します

ISO-8601の定義、週は月曜日に始まり、最初の週が4日以上を持っています。

ISO-8601規格では、週単位でカレンダーシステムを定義しています。それは、標準年/月/日の代わりに日の経過を分割するために、週単位の年および週単位の年の概念を使用します。

前の暦年に最初の週が始まることに注意してください。暦年の最初の数日は前の暦年に対応する週ベースの年になるかもしれないことにも注意してください。

その定義から

、あなたが得ることができます。これは、数週間は固定で開始今年のコンセプトを表し

  • weekBasedYear()は週ベースの年間のフィールドを表し月曜日などの曜日は正確に1年に属します。

この場合、希望する年に設定します。

  • weekOfWeekBasedYear()これは、月曜日と各週間は固定された曜日に開始する年以内の週の数の概念を表し

    週ベース年の週を表し週は正確に1年に属します。この場合

    我々は曜日を表し1.

  • ChronoField.DAY_OF_WEEKにそれを設定して、私たちは週ベース年の最初の週をしたいです。この場合、我々は、週の最初の日は、私たちは、このような日付で、あなたが本当にLocalDate.plusWeeks(1)を呼び出すことにより、年間のすべての週を反復処理することができ、その後1
  • に設定します。質問は何回反復する必要がありますか? 1年に52週間以上かかることがあります。週単位で52週か53週があります。

    次のようにして、週数を取得できます。このコールrangeRefinedBy(date)は、指定された日付の週のフィールドの有効な値を取得し、その最大値を取得します。

    long maxWeekOfYear = weekFields.weekOfWeekBasedYear().rangeRefinedBy(date).getMaximum(); 
    
    +0

    ' weekOfWeekBasedYear() 'と' weekBasedYear() 'が必要です。 weekOfYear() 'と' dayOfWeek() 'があります。 2つは異なっています。しかし、この場合、混乱を避けるために 'IsoFields.WEEK_OF_WEEK_BASED_YEAR'と' IsoFields.WEEK_BASED_YEAR'を使う方がいいでしょう。 – JodaStephen

    +0

    @JodaStephen少し拡大できますか?私は2010年から2020年にかけてテストしましたが、結果は正しいと思われましたが、時にはこれらすべての定義に問題があることを認めています:)(そして、IsoFieldsは存在していました...)。 – Tunaki

    +1

    'weekOfYear()'は1年以内に動作します。 'weekOfWeekBasedYear()'は 'weekBasedYear()'の中で動作します(週ベースの最初の日は前の暦年であり、最後の日は次の暦年であるかもしれません)。 OPは週単位でISOを尋ねるので、週単位の方法が必要です。 – JodaStephen

    関連する問題