我想将YearMonth
转换为具有指定LocalDate
的{{1}},例如2019年2月的第二个星期二。
以下代码引发DayOfWeek
:
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);
的更干净的解决方案?
答案 0 :(得分:2)
您已经自己找到了最好,最干净(或最差的一种)解决方案:
LocalDate date = yearMonth.atDay(1).with(secondTuesday);
atDay
的参数不一定必须为1,但必须是所讨论的月份中的有效日期,所以为什么不为1?
with()
始终返回与您调用时相同的类型。也就是说,YearMonth.with()
将始终返回YearMonth
,而不会返回LocalDate
。因此,您不能在那里使用调节器。
我理解并分享您的反对意见,但是您已经拥有的是我们能做到的最好的。您可以并且应该将其包装在一个名称不错的方法中。
答案 1 :(得分:0)
我相信您的代码即将完成。重要的一点是,需要使用TemporalAdjusters.dayOfWeekInMonth()方法来提供带日期的LocalDate。
您的示例是正确的,但是如果您想更清楚一点,可以更改为:
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