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

标签 java java-8

我想根据 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) 不会向前跳转 到星期一,以防日期指向星期日。

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

关于java - 基于 Java 8 中的 LocalDate.now() 获取一周的第一天的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450720/

相关文章:

java - java中根据条件使用流操作将List转换为Map

Java 1.8 及以下版本等效于 InputStream.readAllBytes()

java - 一种在 Java 8 中为算术运算编写函数的简洁方法

java - datepicker android - 构建错误

java - GWT 中使用 Google 帐户进行授权/身份验证

java - 尝试在 Android 中使用全息主题不起作用

java - 如何等待发送进程

java - Selenium WebDriver 没有通过 XPATH 找到元素

java - 改变 Lambda 表达式的 `free variables`

Java 8 循环使用 com.google.common.collect.Iterables.partition 的方法?