1 回答

TA貢獻1803條經驗 獲得超6個贊
這里的關鍵是理解幾點:
您以兩種不同的方式計算周數(shù)。對于您使用 ISO 編號的一年中的一周:一年中的第一周至少包括新年的 4 天。對于一個月中的一周,您正在計算星期一(您可以說該月的第一周是包括該月七天而不是四天的那一周)。
周數(shù)可能并不總是存在。如果您的起點是該月的第 0 周或第 5 周,則前一個月可能沒有該周。
獲得的結果與預期的不同。我認為問題是由于我沒有指定如何計算該月的第一周(該月的第一個星期一)。這樣對嗎?我該如何解決?
你是對的。要計算每月的星期一,您可以使用:
LocalDate tempDate = date.withYear(2019) .withMonth(i) .with(ChronoField.DAY_OF_WEEK, DayOfWeek.MONDAY.getValue()) .with(ChronoField.ALIGNED_WEEK_OF_MONTH, weekMonth);
(當然DayOfWeek.MONDAY.getValue()
只是羅嗦的說法1
,但更能表達意圖,所以我更喜歡它。)
通過對您的代碼進行此更改,輸出是預期的:
2 6 10 14 19 23 27
關鍵是ChronoField.ALIGNED_WEEK_OF_MONTH
。一個月的對齊星期從該月的 1 號開始,并且無論星期幾如何,始終為 7 天。第一個對齊的周是從該月的 1 號到 7 號,如果是從 8 號到 14 號,則第二個對齊的周是等等。因為我們已經將星期幾設置為星期一,所以將對齊的星期設置為 1 給我們第一個星期一月份等
我們還沒有完成。如果我設置weekNumber
為 40,我會得到:
2 6 10 14 14 23 27 27 36 41
我原以為 40 是列表中的最后一個數(shù)字,但它不在那里。2019 年的第 40 周是從 9 月 30 日星期一到 10 月 6 日,所以如果我理解正確的話,你想要那些有第 5 周的月份的第 5 周。這讓我們回到并非所有月份都有第 5 周的問題(因為他們沒有 5 個星期一)。發(fā)生的事情是,由于我在星期二運行您的代碼,因此以第 40 周的星期二(即 10 月 1 日)為起點,因此給了我每個月的第 1 周而不是第 5 周。
有更好的解決方案嗎?你能推薦一個嗎?
我真的不能。你得到的很好。
只有你沒有使用int weekYear
參數(shù)。您可能想用它代替weekNumber
局部變量。在任何情況下,您都應該刪除其中一個并使用另一個。
這個不相關的提示:您使用LocalDate.from(someLocalDate)
是多余的,因為它只會再次給您相同的LocalDate
對象(相同的對象或相同的對象,我不知道或不在乎)。只是在那些情況下使用someLocalDate
。
添加回答
舉報