在 Java 8 中基于 LocalDate.now() 获取一周第一天的日期

2022-08-31 12:34:11

我希望根据LocalDate.now()获取一周第一天的日期。JodaTime可以实现以下功能,但似乎已从Java 8中的新Date API中删除。

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

我不能称之为“withDayOfWeek()”,因为它不存在。

所以我的问题是:如何根据一些LocalDate获取一周第一天的日期?


答案 1

请注意,该表达式与区域设置无关,因为它使用 ISO-8601,因此它始终向后跳转到上一个星期一(或者如果日期已经指向星期一,则停留在星期一)。System.out.println(now.with(DayOfWeek.MONDAY))

因此,在美国或其他一些国家 - 一周从星期日开始 - 它可能不像您预期的那样工作 - 如果日期指向星期日,则不会跳到星期一。now.with(DayOfWeek.MONDAY)

如果您需要解决这些问题,最好使用本地化字段 WeekFields.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)


答案 2

尝试

System.out.println(now.with(DayOfWeek.MONDAY));

推荐