JVM中的“每周第一天”是基于语言还是国家/地区?

7

可以通过调用Calendar.getInstance(locale).getFirstDayOfWeek()来获取JVM上的第一周是星期几。但这个信息是基于语言还是国家呢?

2个回答

8
事实证明,这取决于JDK版本。JDK8根据语言返回星期的第一天,因此对于“en_FI”、“en_US”,它返回“SUNDAY”,而对于“fi_FI”和“fi_US”,它返回“MONDAY”。
然而,JDK9切换到了CLDR系统,该系统(更合理地)使用国家。因此,JDK9将为“en_FI”和“fi_FI”区域同时返回“MONDAY”,并且将为“fi_US”和“en_US”返回“SUNDAY”。
有关更多详细信息,请参见JEP 252
此外,引用自JDK-8203280

为了解释这种行为,CLDR实现是正确的,即应该通过地区来定义星期的第一天,而不是通过语言。


2
它并不是真的“基于语言”的说法。实际上只是基于Java 8和9之间的不同数据 - Michael
此外,我认为链接到一个错误可能会有些误导,因为实际上它并不是一个错误。 - Michael
我同意,但是这个 bug 以更清晰的方式回答了问题。让我重新表述一下答案。 - Martin Vysny
1
你可以获得你想要的行为。例如,在Java 8中,你可以将系统属性java.locale.providers设置为CLDR,COMPAT,以优先使用CLDR语言环境数据。或者在Java 9中将其设置为COMPAT,CLDR,以优先使用Java 8兼容数据而非CLDR。 - Ole V.V.

1

2
这就是问题所在 - 它不是 :( 当在OpenJDK8上运行Calendar.getInstance(new Locale("fi", "US")).getFirstDayOfWeek()时,它将返回MONDAY,尽管该国家是美国。 在JDK8上,这是基于语言的。难道Oracle JVM工作方式不同吗? - Martin Vysny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接