-1

我正在尝试获取带有月份编号、月份编号和星期几的日期,我认为这很容易并做到了:

LocalDate nextbookingDate = LocalDate.now().plusYears(1);
nextBookingDate = nextBookingDate.with(Month.of(1));
nextBookingDate = nextBookingDate.with(WeekFields.ISO.weekOfMonth(), 1);
nextBookingDate = nextBookingDate.with(DayOfWeek.of(1));
System.out.println(nextBookingDate); //2019-12-30

nextBookingDate应该是 2020-01-06,因为它是 1 月的第一个星期一。
但是为什么我会得到 2019-12-30 以及如何解决这个问题?

4

2 回答 2

2

在每一行中,您都将覆盖您在上一行中所做的事情。尝试这样的事情:

nextBookingDate = now()
   .with(Month.of(1))
   .with(WeekFields.ISO.weekOfMonth(), 1)
   .with(DayOfWeek.of(1));

但请注意,2019 年 12 月 30 日实际上2020 年第一周的第一天。

由于问题已更新,因此更相关的答案是:

LocalDate nextBookingDate = LocalDate.now().plusYears(1)
   .with(Month.JANUARY)
   .with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.MONDAY));

您可以根据需要将 1 作为 dayOfWeekInMonth 的参数替换为 2 到 5 之间的数字。

于 2019-12-08T13:42:48.557 回答
1

我并不完全清楚您通常想要什么结果,以及为什么。如果我可以假设您想要下一个日期是某个月的第n天,那么它比您的代码要复杂一些。编辑: NorthernSky在他/她的回答下的评论中是正确的,它.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.MONDAY))更直接、更简短地为我们提供了我们需要的东西。这应该有效:

    ZoneId zone = ZoneId.of("Africa/Bamako");
    LocalDate today = LocalDate.now(zone);
    LocalDate nextBookingDate = today.with(Month.JANUARY)
            .with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.MONDAY));
    if (nextBookingDate.isBefore(today)) {
        // Take next year instead
        nextBookingDate = today.plusYears(1)
                .with(Month.JANUARY)
                .with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.MONDAY));
    }

    System.out.println("Next booking date: " + nextBookingDate);

我刚才运行代码时的输出是:

下次预订日期:2020-01-06

TemporalAdjusters.dayOfWeekInMonth()将为我们提供该月的第一个星期一、第三个星期二等。因此,将一周中的任何一天和最多 4 或 5 的任何数字输入此方法。

请提供我放置非洲/巴马科的所需时区,因为它在所有时区都不是相同的日期。

链接: 的文档TemporalAdjusters.dayOfWeekInMonth()

于 2019-12-08T14:04:42.023 回答