首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自具有第n个DayOfWeek的YearMonth的LocalDate

来自具有第n个DayOfWeek的YearMonth的LocalDate
EN

Stack Overflow用户
提问于 2018-12-23 19:38:08
回答 2查看 2.1K关注 0票数 2

我想要将YearMonth转换为具有指定DayOfWeekLocalDate,例如2019年2月的第二个星期二。

下面的代码抛出一个DateTimeException

代码语言:javascript
复制
YearMonth yearMonth = YearMonth.of(2019, Month.FEBRUARY);
TemporalAdjuster secondTuesday = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY);

LocalDate date = LocalDate.from(yearMonth).with(secondTuesday);

为了使我的代码正常工作,我需要将最后一行替换为

代码语言:javascript
复制
LocalDate date = yearMonth.atDay(1).with(secondTuesday);

有没有一个更干净的解决方案,不需要使用atDay(1)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-23 21:42:40

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

代码语言:javascript
复制
LocalDate date = yearMonth.atDay(1).with(secondTuesday);

atDay的参数不一定需要是1,但它需要是相关月份的有效日期,所以为什么不是1呢?

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

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

票数 3
EN

Stack Overflow用户

发布于 2018-12-23 21:37:23

我相信你的代码已经差不多完成了。重要的一点是,为了使用TemporalAdjusters.dayOfWeekInMonth()方法,您需要为LocalDate提供一个day。

你的例子是正确的,但是如果你想更清楚一点,你可以改成:

代码语言:javascript
复制
TemporalAdjuster secondTuesday = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY);
LocalDate dateLocalDate = LocalDate.of(2019, Month.FEBRUARY, 1).with(secondTuesday);

并将此代码放入一个方法中,如下所示:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53903285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档