[英]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,因为它是一月份的第一个星期一。
但是为什么我会收到 2019-12-30 以及如何解决这个问题?
在每个新行中,您都将覆盖您在前一行中所做的工作。 尝试这样的事情:
nextBookingDate = now()
.with(Month.of(1))
.with(WeekFields.ISO.weekOfMonth(), 1)
.with(DayOfWeek.of(1));
但要注意,二零一九年十二月三十零日实际上是2020年第一周的第一天。
由于问题已更新,因此更相关的答案是:
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);
我刚才运行代码时的输出是:
下次预订日期:2020-01-06
TemporalAdjusters.dayOfWeekInMonth()
将为我们提供该月的第一个星期一、第三个星期二等。 因此,将一周中的任何一天和最多 4 或 5 的任何数字输入到此方法中。
请提供您想要的时区,因为它在所有时区中都不是相同的日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.