【问题标题】:LocalDate from YearMonth with nth DayOfWeek来自 YearMonth 和第 n 个 DayOfWeek 的 LocalDate
【发布时间】:2019-05-23 00:26:01
【问题描述】:

我想用指定的DayOfWeekYearMonth 转换为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) 的更清洁的解决方案吗?

【问题讨论】:

  • 注:您不能对仅由年和月创建的部分日期使用日操作。
  • 恐怕没有更干净的方法了。至少我想不出一个。我理解并同意您的反对意见。

标签: java time java-8 localdate


【解决方案1】:

您自己已经找到了最好、最干净(或最不差)的解决方案:

LocalDate date = yearMonth.atDay(1).with(secondTuesday);

atDay 的参数不一定必须为 1,但它必须是相关月份中的有效日期,那么为什么不是 1?

with() 总是返回你调用它的相同类型。也就是说,YearMonth.with() 将始终返回 YearMonth,而不是 LocalDate。因此你不能在那里使用你的调节器。

我理解并同意你的反对意见,但你已经得到的就是我们能做的最好的了。您可以而且应该将其包装在一个具有好听名称的方法中。

【讨论】:

    【解决方案2】:

    我相信您的代码几乎完成了。重要的是要使用 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

    【讨论】:

    • OP 似乎想使用 YearMonth,所以不确定删除 YearMonth 是如何使它更清晰的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多