Java LocalDate如何将一年的最后一周作为第53周而不是新年的第1周?

问题描述 投票:2回答:3

[如果您认为该周将从每年的Jan 01开始,而周起始为SUNDAY,那么在2019年将有53个星期。接下来的Jan 29,30,31 2019将进入Week-53 of 2019

IsoFieldsWEEK_OF_WEEK_BASED_YEAR文档中给出的all three fields are validated against their range of valid values. The week-of-week-based-year field is validated from 1 to 52 or 53 depending on the week-based-year.

因此,我假定以下代码应将输出显示为:WEEK_OF_WEEK_BASED_YEAR 53WEEK_BASED_YEAR 2019。

但是它的输出为:12020

import java.time.LocalDate;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.time.temporal.IsoFields;

public class WeekStartDemo {
    public static void main(String args[]) {
        DateTimeFormatter DATE_FORMATTER = DateTimeFormatter
                .ofPattern("uuuu-MM-dd")
                .withChronology(IsoChronology.INSTANCE)
                .withResolverStyle(ResolverStyle.STRICT);

        LocalDate updatedDate = LocalDate.parse("2019-12-30", DATE_FORMATTER);

        System.out.println(updatedDate.toString());

        System.out.println(updatedDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
        System.out.println(updatedDate.get(IsoFields.WEEK_BASED_YEAR));
    }
}

如果我将日期作为2019-12-28传递,则它将返回WEEK_OF_WEEK_BASED_YEAR 52WEEK_BASED_YEAR 2019。但不适用于2019年的最后一周(即第53周)

让我知道以上代码中缺少的内容。

java java-time
3个回答
0
投票

这里的问题是,给定的一年有365天或366天(后一个年份是a年),这意味着每年在52周之外的每一年都有1或2天。一周的ISO体系就是解决这个问题的方法,这意味着有时一年的第一周可能不会在1月1日开始,一年的最后一天也不会落在第52周。一种解决方法是只计算从每年年初开始的一周,例如

LocalDate firstOfYear = LocalDate.of(2019, Month.JANUARY, 1);
LocalDate updatedDate = LocalDate.of(2019, Month.DECEMBER, 30);

int diff = (int)ChronoUnit.DAYS.between(firstOfYear, updatedDate);
int week = 1 + (diff / 7);
System.out.println("The week number is: " + week);

0
投票

基于ISO-8601(https://www.cl.cam.ac.uk/~mgk25/iso-time.html),这是正确的。 2019年没有日历周53。按照定义,一年的第01周是今年中具有星期四的第一周,它等效于包含一月四日的一周。据我所知,这样做是为了避免没有工作日的cw 1。


0
投票

正如我在评论中提到的那样,并且从Javadoc链接的IsoFields中,基于星期的年份本身是相对于标准ISO认可年份定义的。它与标准年份的不同之处在于,它始终始于Monday(而不是星期日)。使用发布的代码查找53周的年份,从IsoFields迭代到1900,解析给定年份的最后一天的2300,并在53处打印值,应该很容易。 ,

WEEK_OF_WEEK_BASED_YEAR

我得到的前几个值是

DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuu-MM-dd")
        .withChronology(IsoChronology.INSTANCE)
        .withResolverStyle(ResolverStyle.STRICT);

for (int i = 1900; i < 2300; i++) {
    LocalDate updatedDate = LocalDate.parse(String.format("%d-12-31", i), DATE_FORMATTER);
    if (updatedDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) == 53) {
        System.out.println(i);
    }
}

向前跳过...

1903
1908
1914
1920
1925
1931
1936
1942

所以this年(2020)有53周,而2019年没有。


0
投票
2009
2015
2020
2026

此行的输出是:

53

© www.soinside.com 2019 - 2024. All rights reserved.