我想要将YearMonth转换为具有指定DayOfWeek的LocalDate,例如2019年2月的第二个星期二。
下面的代码抛出一个DateTimeException
YearMonth yearMonth = YearMonth.of(2019, Month.FEBRUARY);
TemporalAdjuster secondTuesday = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY);
LocalDate date = LocalDate.from(yearMonth).with(secondTuesday);为了使我的代码正常工作,我需要将最后一行替换为
LocalDate date = yearMonth.atDay(1).with(secondTuesday);有没有一个更干净的解决方案,不需要使用atDay(1)
发布于 2018-12-23 21:42:40
你自己已经找到了最好的、最干净的(或最不差的)解决方案:
LocalDate date = yearMonth.atDay(1).with(secondTuesday);atDay的参数不一定需要是1,但它需要是相关月份的有效日期,所以为什么不是1呢?
with()总是返回与您调用它时相同的类型。也就是说,YearMonth.with()将始终返回YearMonth,而不是LocalDate。因此,您不能在那里使用调整器。
我理解并同意你的反对意见,但你所得到的已经是我们所能做的最好的了。您可以而且应该将其包装在一个具有好名字的方法中。
发布于 2018-12-23 21:37:23
我相信你的代码已经差不多完成了。重要的一点是,为了使用TemporalAdjusters.dayOfWeekInMonth()方法,您需要为LocalDate提供一个day。
你的例子是正确的,但是如果你想更清楚一点,你可以改成:
TemporalAdjuster secondTuesday = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY);
LocalDate dateLocalDate = LocalDate.of(2019, Month.FEBRUARY, 1).with(secondTuesday);并将此代码放入一个方法中,如下所示:
public static void main(String[] args) {
LocalDate localDate = getLocalDateByDayOfWeek(2019, Month.FEBRUARY, 2, DayOfWeek.TUESDAY);
System.out.println(localDate);
}
private static LocalDate getLocalDateByDayOfWeek(int year, Month month, int weekNumber, DayOfWeek dayOfWeek) {
TemporalAdjuster temporalWeek = TemporalAdjusters.dayOfWeekInMonth(weekNumber, dayOfWeek);
return LocalDate.of(year, month, 1).with(temporalWeek);
}您可以在这里找到有关此方法的文档:TemporalAdjusters Docs
https://stackoverflow.com/questions/53903285
复制相似问题