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()
.
我正在尝试获取包含月号、月中周数和星期几的日期 我认为这很容易,所以这样做了:
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()
.