【发布时间】:2016-05-12 13:35:23
【问题描述】:
我需要使用 Java 8 日期和时间 API (java.time) 找到一年中最后一周的第一天,最后得出了这个解决方案:
LocalDate date = LocalDate.of(2016, 2, 17);
LocalDate lastWeekOfYear = LocalDate.of(date.getYear() + 1, 1, 7)
.with(WeekFields.ISO.weekOfYear(), 1)
.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusDays(7);
此解决方案查找下一年的第一周,如有必要,将星期几调整为星期一,并向后移动 7 天。有没有更聪明的方法来达到同样的效果?
【问题讨论】:
-
对我来说看起来不错,虽然我可能会使用
minusWeeks(1)而不是minusDays(7),并将它放在一个新行上。你可以为lastWeekOfWeekYear写你自己的TemporalAdjuster -
另一种选择(不一定更具可读性)是
date.with(lastDayOfYear()).minusDays(7 - WeekFields.ISO.getMinimalDaysInFirstWeek()).with(previousOrSame(MONDAY)) -
@Oxolotl 我建议您提取您提出的解决方案,并将其作为答案发布。您稍后可以接受它以将问题标记为已关闭。完全可以在 Stack Overflow 上回答您自己的问题。
-
使用我的库 Time4J 启用 more elegant solution。调整代码将减少到
date = date.with(ISO.weekOfYear().maximized()).with(DAY_OF_WEEK, MONDAY);否则-仅使用java.time-package时-我强烈建议使用weekOfWeekBasedYear()-另请参阅java.time-API中与weekOfYear()的子图差异。 -
感谢@MenoHochschild 建议使用
weekOfWeekBasedYear(),我相应地更新了解决方案。但是当我要求一个简单的 java.time 解决方案时,另一个库的使用超出了这个问题的范围。