- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我这里有非常简单的程序:
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我很好奇为什么会这样。
最佳答案
这样的星期字段是高度本地化的,因此依赖于底层 JVM 的本地化资源,这些资源可以从一个版本更改为另一个版本。
我认为 JVM10 更正确,因为 Locale.GERMAN
没有指代任何国家,因此 Java 简单假设美国(将这个国家作为世界标准处理有点问题,但 Java 也是如此)。
你最好使用 Locale.GERMANY
。该国家/地区确实使用星期一作为一周的第一天(与美国从星期日开始作为对比,后者用作 GERMAN
的后备,它只是一种语言,而不是一个国家/地区。
current CLDR data列出后备国家/地区“001”(= 全局)周定义(星期一作为一周的第一天,1 = 日历年第一周的最少天数)。令人惊讶的是,这与美国的定义不同(星期日,1 日)。我认为,甲骨文只是做了自己的事情。就我个人而言,我同意@Holger 的观点,并希望 ISO-8601 作为后备(星期一,4)。
但是,您可以通过以下设置在 JVM-10 机器上恢复 Java-8 行为 system property (未测试):
java.locale.providers=COMPAT,CLDR,SPI
关于java - WeekFields 在 JVM 8 和 JVM 10 上的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55139324/
我这里有非常简单的程序: public static void main(String[] args) { LocalDate year = LocalDate.ofYearDay(
我确定我只是在这里遗漏了一些东西,但它一直在躲避我。 为什么 SUNDAY_START 会为 2020-12-29 生成周数 1 而不是 53? 是因为我误解了 Oracle 文档所说的内容吗?还是我
我是一名优秀的程序员,十分优秀!