我想根据 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/