首页 > 解决方案 > java.time.Year#range 不返回一年中的具体星期(Java 1.8)

问题描述

我想知道为什么一个具体的实例java.time.Year#range无法返回具体ValueRange的可能周数。


我知道以下代码失败,因为IsoFields.WEEK_OF_WEEK_BASED_YEAR不支持:

ValueRange range = Year.of(2018).range(IsoFields.WEEK_OF_WEEK_BASED_YEAR)

不过,我想知道为什么以下代码返回 a ValueRangeof 0/1 - 52/54

ValueRange range = Year.of(2018).range(WeekFields.ISO.weekOfWeekBasedYear())

我知道这是真的,但它是ValueRange任何Year.


根据我收集到的信息,给定一年的具体实例,您可以找出适合该特定年份的实际周数范围(在此示例Year.of(2018)中包含周数1 - 52(因为 2018-12-31 实际上属于2019-W01.

同样的咆哮基本上适用于 YearMonth。


我知道获得正确范围的唯一方法是使用以下方法:

LocalDate date = Year.of(2021).atDay(4)
ValueRange range2 = date.range(WeekFields.ISO.weekOfWeekBasedYear()) // 1-52

因为--01-04 始终属于--W01,所以您必须注意以下内容实际上会产生不同的结果:

LocalDate date = Year.of(2021).atDay(1)
ValueRange range = date.range(WeekFields.ISO.weekOfWeekBasedYear()) // 1-53 (incorrect!)

尽管如此,仅仅为了获取给定年份中可能的周数的值范围而创建一些任意日期似乎是错误的。


所以,基本上,我想问的是这是什么原因,你是否知道更好的方法来做到这一点?

另外,我没有改变在 1.8 以外的 Java 版本中尝试这个;也许这在 JDK9/10/11 中得到了改进?

标签: javajava-time

解决方案


推荐阅读