1. 序章

この記事では、Javaで使用できるいくつかのオプションを調べて、特定の日付の週番号を取得します。 Java8より前のクラスを使用したレガシーコードのいくつかのオプションを確認することから始めます。 その後、Java8で導入されたjava.timeパッケージの新しいDateTimeAPIを見ていきます。

2. Java8より前

Java 8より前は、日付と時刻の計算は主にDateクラスとCalendarクラスを使用して実行されていました。 通常、 Calendar を作成し、さまざまな定数を使用して、そこから必要な情報を抽出することができます。

2.1. カレンダーフィールドを使用して週番号を取得する

最初の例を見てみましょう。

Calendar calendar = Calendar.getInstance(locale); 
calendar.set(year, month, day); 
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);

指定されたLocaleCalendarインスタンスを作成し、年、月、日を設定するだけで、最後にからWEEK_OF_YEARフィールドを取得します。 ]calendarオブジェクト。 これにより、現在の年内の週番号が返されます。

それでは、単体テストの1つからこのメソッドを呼び出す方法を見てみましょう。

@Test
public void givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() {
    Calendar calendar = Calendar.getInstance(Locale.ITALY);
    calendar.set(2020, 10, 22);

    assertEquals(47, calendar.get(Calendar.WEEK_OF_YEAR));
}

Calendar クラスの月フィールドはゼロベースであるため、このアプローチを採用する場合は注意が必要です。つまり、12月を指定する場合は、数値11を使用する必要があります。これはしばしば混乱を招く可能性があります。

2.2. ロケール設定を使用して週番号を取得する

この最後から2番目の例では、カレンダーにいくつかの追加設定を適用した場合の効果を見ていきます。

Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(firstDayOfWeek);
calendar.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek);
calendar.set(year, month, day);

int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);

Calendar クラスは、次の2つのメソッドを定義します。

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

これらの方法は、週数の計算方法に影響を与えます。 通常、これらの値は両方とも、カレンダーの作成時にロケールから取得されます。 ただし、週の最初の日と年の最初の週の最小日数を手動で設定することもできます。

2.3. ロケール違い

ロケールは、週数の計算方法で重要な役割を果たします。

@Test
public void givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() {
    Calendar calendar = Calendar.getInstance(Locale.CANADA);
    calendar.set(2020, 10, 22);

    assertEquals(48, calendar.get(Calendar.WEEK_OF_YEAR));
}

この単体テストでは、CalendarのロケールをLocale.ITALYではなくLocale.CANADAを使用するように変更しただけで、返される週番号は次のようになります。 47の代わりに48

どちらの結果も正しいです。 前述のように、これは、ロケールごとにsetFirstDayOfWeekメソッドとsetMinimalDaysInFirstWeekメソッドの設定が異なるために発生します

3. Java8日時API

Java 8は、古いjava.util.Dateおよびjava.util.Calendarの欠点に対処するために、 Date andTimeに新しいAPIを導入しました。

このセクションでは、この新しいAPIを使用して日付から週番号を取得するためのいくつかのオプションを見ていきます。

3.1. 数値を使用して週番号を取得する

同様に、 Calendar で前に見たように、年、月、日の値をLocalDateに直接渡すこともできます。

LocalDate date = LocalDate.of(year, month, day);
int weekOfYear = date.get(WeekFields.of(locale).weekOfYear());

Java 8より前の例に対する利点は、月フィールドがゼロベースであるという問題がないことです。

3.2. Chronofieldを使用して週番号を取得する

この最後の例では、TemporalFieldインターフェイスを実装するChronoField列挙を使用する方法を示します。

LocalDate date = LocalDate.of(year, month, day);
int weekOfYear = date.get(ChronoField.ALIGNED_WEEK_OF_YEAR);

この例は、前に見た Calendar.WEEK_OF_YEAR int 定数を使用するのと似ていますが、ChronoField.ALIGNED_WEEK_OF_YEARを使用します。

4. 結論

このクイックチュートリアルでは、プレーンJavaを使用して日付から週番号を取得するいくつかの方法を説明しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。