YearMonth的LocalDate与第n个DayOfWeek

时间:2018-12-23 11:38:08

标签: java time java-8 localdate

我想将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); 的更干净的解决方案?

2 个答案:

答案 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