簡體   English   中英

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,因為它是一月份的第一個星期一。
但是為什么我會收到 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 的任何數字輸入到此方法中。

請提供您想要的時區,因為它在所有時區中都不是相同的日期。

鏈接: TemporalAdjusters.dayOfWeekInMonth()文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM