1. ホーム
  2. java

Java 8でLocalDate.now()に基づいて週の初めの日の日付を取得する

2023-11-20 08:15:51

質問

LocalDate.now()に基づいて週の初めの日の日付を取得したいです。以下はJodaTimeで可能でしたが、Java 8の新しいDate APIから削除されたようです。

LocalDate now = LocalDate.now();
System.out.println(now.withDayOfWeek(DateTimeConstants.MONDAY));

withDayOfWeek()'が存在しないため、呼び出すことができません。

そこで質問なのですが。 どのようにいくつかのLocalDateに基づいて週の最初の日の日付を取得するには?

どのように解決するには?

なお、この式は System.out.println(now.with(DayOfWeek.MONDAY)) は ISO-8601 を使用しているためロケールに依存せず、常に先週の月曜日にジャンプします (あるいは、日付が既に月曜日を指している場合はそのままです)。

そのため、米国やその他の国々では、週が日曜日から始まるため、期待通りに動作しないかもしれません。 now.with(DayOfWeek.MONDAY) は前方にジャンプしません。 にジャンプしません。

これらの懸念に対処する必要がある場合、ローカライズされたフィールドである ウィークフィールド.dayOfWeek() :

LocalDate now = LocalDate.now();
TemporalField fieldISO = WeekFields.of(Locale.FRANCE).dayOfWeek();
System.out.println(now.with(fieldISO, 1)); // 2015-02-09 (Monday)

TemporalField fieldUS = WeekFields.of(Locale.US).dayOfWeek();
System.out.println(now.with(fieldUS, 1)); // 2015-02-08 (Sunday)

以下のコメントによる別の例です。

LocalDate ld = LocalDate.of(2017, 8, 18); // Friday as original date

System.out.println(
    ld.with(DayOfWeek.SUNDAY)); // 2017-08-20 (2 days later according to ISO)

// Now let's again set the date to Sunday, but this time in a localized way...
// the method dayOfWeek() uses localized numbering (Sunday = 1 in US and = 7 in France)

System.out.println(ld.with(WeekFields.of(Locale.US).dayOfWeek(), 1L)); // 2017-08-13
System.out.println(ld.with(WeekFields.of(Locale.FRANCE).dayOfWeek(), 7L)); // 2017-08-20

アメリカの例では、アメリカでは日曜日が週の初めの日と考えられているので、アメリカに住んでいる人は次の日曜日ではなく最後の日曜日に行くことを期待していることがよくわかります。ISOベースのシンプルな表現 with(DayOfWeek.SUNDAY) はこのローカライゼーションの問題を無視します。