第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Java 找到一年中第 # 周的月份的所有周數(shù)?

如何使用 Java 找到一年中第 # 周的月份的所有周數(shù)?

侃侃爾雅 2023-06-14 14:23:50
我希望建立一個函數(shù),該函數(shù)返回一個數(shù)組,其中包含一年中前幾個月的所有周數(shù),這些周數(shù)與一個特定月份的周數(shù)相同。我將星期一用作一周的第一天,并將本月的第一個星期一作為本月的第一周。輸入:一年中的一周和一年。例如,27 和 2019。七月的第一周(7)。輸出:月份的星期數(shù)組。例如,[2、6、10、14、19、23、27]。我嘗試的是:private void getResult(int weekYear){    LocalDate date = LocalDate.now();    final int weekNumber = 27;    LocalDate newDate = date.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber);    int month = newDate.getMonthValue();;            int weekMonth = LocalDate.from(newDate).get(WeekFields.ISO.weekOfMonth());            System.out.println(newDate);    System.out.println(month);    System.out.println(weekMonth);            ArrayList<Integer> list = new ArrayList<Integer>();            for (int i = 1; i <= month; i++)    {        LocalDate tempDate = date.withYear(2019).withMonth(i).with(WeekFields.ISO.weekOfMonth(), weekMonth);        int tempYear = LocalDate.from(tempDate).get(WeekFields.ISO.weekOfWeekBasedYear());        list.add(tempYear);    }            list.forEach((e) -> System.out.print(e + " "));}int weekYear = 27;getResult(weekYear);我得到的是:[1 6 10 14 18 23 27]。我在找什么:我有兩個問題:第一個:得到的結果和預期的不一樣。我認為問題是由于我沒有指定如何計算該月的第一周(該月的第一個星期一)。這樣對嗎?我該如何解決?第二個:什么是更好的解決方案?
查看完整描述

1 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

這里的關鍵是理解幾點:

  1. 您以兩種不同的方式計算周數(shù)。對于您使用 ISO 編號的一年中的一周:一年中的第一周至少包括新年的 4 天。對于一個月中的一周,您正在計算星期一(您可以說該月的第一周是包括該月七天而不是四天的那一周)。

  2. 周數(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


查看完整回答
反對 回復 2023-06-14
  • 1 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號