Java 日期操作

Java date-manipulation

我正在尝试获取包含月号、月中周数和星期几的日期 我认为这很容易,所以这样做了:

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,我该如何解决?

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

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

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

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

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

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

我不太清楚你想要什么结果,为什么。如果我可以假设您想要下一个日期是某个月的第 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);

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

Next booking date: 2020-01-06

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

请在我输入 Africa/Bamako 的位置提供您想要的时区,因为所有时区的日期都不会相同。

Link: Documentation of TemporalAdjusters.dayOfWeekInMonth().