【发布时间】:2017-04-05 17:44:15
【问题描述】:
我想获取与当前月份重叠的几周内的第一个星期一和最后一个星期日,即使星期一或星期日不是来自当前月份。
例如本月 2017-04(4 月),第一个星期一是 3 月 27 日,最后一个星期日是 4 月 30 日。
【问题讨论】:
-
@EduardoDennis 不完全是重复的。这个问题更复杂,跨越了月份的界限。
我想获取与当前月份重叠的几周内的第一个星期一和最后一个星期日,即使星期一或星期日不是来自当前月份。
例如本月 2017-04(4 月),第一个星期一是 3 月 27 日,最后一个星期日是 4 月 30 日。
【问题讨论】:
TemporalAdjuster 接口提供类来操作日期时间值。 TemporalAdjusters 类提供了几个方便的实现。
策略是首先确定当前日期。这需要一个时区。对于任何给定的时刻,日期在全球范围内因地区而异。
从今天开始,获取当月的第一天和最后一天。从每个人那里,我们要求我们想要的星期几的前一个或下一个出现。我们还接受,第一个月或最后一个月实际上可能是所需的星期几,这就是下面看到的TemporalAdjusters 调用中的“orSame”的含义。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
LocalDate firstOfMonth = today.with( TemporalAdjusters.firstDayOfMonth() );
LocalDate monday = firstOfMonth.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) );
LocalDate endOfMonth = today.with( TemporalAdjusters.lastDayOfMonth() );
LocalDate sunday = endOfMonth.with( TemporalAdjusters.nextOrSame( DayOfWeek.SUNDAY ) );
顺便说一句,如果你需要表示整个月份,请查看YearMonth 类。
【讨论】:
您可以使用日历并进行迭代以查找您要查找的日期,例如:Calendar.getInstance().get(Calendar.MONDAY) 和 Calendar.getInstance().get(Calendar.SUNDAY));
【讨论】:
Calendar 现在是遗留问题,被 java.time 类所取代。