【发布时间】:2019-08-03 23:29:20
【问题描述】:
我这里有一个非常简单的程序:
public static void main(String[] args) {
LocalDate year = LocalDate.ofYearDay(2022, 100);
System.out.println(year);
System.out.println(WeekFields.of(Locale.GERMAN).weekOfYear());
System.out.println(year.with(WeekFields.of(Locale.GERMAN).weekOfYear(), 0));
System.out.println(year.with(WeekFields.of(Locale.GERMAN).weekOfYear(), 0).with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)));
}
但它在 JVM 8 和 JVM 10 上的行为不同。问题似乎是 WeekFields.of(Locale.GERMAN).weekOfYear() 的实现。
在 JVM 10 上我得到以下结果:
JVM 10
2022-04-10
WeekOfYear[WeekFields[SUNDAY,1]]
2021-12-19
2021-12-13
而在 JVM 8 上:
JVM 8
2022-04-10
WeekOfYear[WeekFields[MONDAY,4]]
2022-01-02
2021-12-27
为什么会这样?我是否在做一些可能导致未定义行为的事情?还是在某处指定了这种行为变化?
JVM10:
$ java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
JVM8
$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
编辑:
JVM 9 的行为与 JVM 8 相同,JVM 11 的行为类似于 JVM 10
编辑 2: 我实际上找到了改变行为的提交 -> here on github,我很好奇为什么会改变。
【问题讨论】:
-
我会亲自将该问题报告给bugreport.java.com/bugreport。
-
还有 jvm-11...
-
在a CLDR page really concerned with Ireland 上,我发现了一个有趣的括号:“(因此默认为星期一,001 的默认 firstDay = 世界)”。如果没有指定国家/地区,听起来星期一应该是默认的一周的第一天,例如“德国”(与“德国”相反,后者显然 是一个国家)。
标签: java java-8 jvm java-10 localdate