У меня есть действительно простая программа здесь:
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: Я на самом деле нашел коммит, который изменил поведение → здесь, на github, и мне любопытно, почему это было изменено.