簡體   English   中英

如何在Java 8中一年中每周迭代一次?

[英]How can I iterate over every week in a year in Java 8?

如果我在這里混淆任何ISO日期相關條款,請提前道歉。

我希望能夠在給定的一年中每周進行一次迭代(比如,2015年)。 我意識到您可以計算2015年1月1日到2015年12月31日之間的周數,但這不符合一周的ISO標准。 相反,它給出了兩個日期之間7天的時間段。 2015年第一個ISO周並不一定從2015年1月1日開始。

如果我能得到第一周的第一個日期,我相信我可以通過ZonedDateTime.plusWeeks(1)進行52周的迭代。 您可以通過字段訪問者獲取任意日期的周數:

ZonedDateTime date = ZonedDateTime.now();
WeekFields weekFields = WeekFields.of(Locale.getDefault());
int weekNumber = date.get(weekFields.weekOfWeekBasedYear());

鑒於此,我認為必須有可能在Java8 Time API中獲取特定年份第一周第一天的日期,但我還沒有找到辦法。

您可以使用以下內容構建日期並將其調整為一年中第一周的第一天:

int year = 2016;
WeekFields weekFields = WeekFields.ISO;
LocalDate date = LocalDate.now().with(weekFields.weekBasedYear(), year)
                                .with(weekFields.weekOfWeekBasedYear(), 1)
                                .with(ChronoField.DAY_OF_WEEK, 1);

感謝JodaStephen的評論,另一種方法是使用IsoFields類。

LocalDate date = LocalDate.now().with(IsoFields.WEEK_BASED_YEAR, year)
                                .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 1)
                                .with(ChronoField.DAY_OF_WEEK, 1);

WeekFields.ISO表示本周的ISO定義:

ISO-8601定義,一周從星期一開始,第一周至少有4天。

ISO-8601標准定義了基於周的日歷系統。 它使用基於周的年和基於周的概念來分解日期而不是標准的年/月/日。

請注意,第一周可能在上一個日歷年開始。 另請注意,日歷年的前幾天可能是與上一個日歷年相對應的基於周的年份。

根據該定義,您可以獲得:

  • weekBasedYear()表示基於周的年份字段:

    這代表了一周的概念,其中周開始於固定的星期幾,例如星期一,每周屬於一年。

    在這種情況下,我們希望將其設置為所需年份。

  • weekOfWeekBasedYear()表示以周為基礎的一周

    這代表了一周中的周數的概念,其中周數在固定的星期幾開始,例如星期一,每周屬於恰好一年。

    在這種情況下,我們想要以周為基礎的第一周,因此我們將其設置為1。

  • ChronoField.DAY_OF_WEEK代表星期幾。 在這種情況下,我們想要一周的第一天,所以我們設置為1。

然后,有了這樣的日期,你可以通過調用LocalDate.plusWeeks(1)來迭代一年中的所有星期。 問題是:你需要迭代多少次? 一年可能超過52周。 基於一周的年份有52或53周。

您可以使用以下內容檢索周數。 此調用rangeRefinedBy(date)檢索給定日期的year of year字段的有效值,並獲取其最大值。

long maxWeekOfYear = weekFields.weekOfWeekBasedYear().rangeRefinedBy(date).getMaximum();

暫無
暫無

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

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