Java 日历#getFirstDayOfWeek()返回错误的值

Java 日历#getFirstDayOfWeek()返回错误的值,java,calendar,locale,dayofweek,Java,Calendar,Locale,Dayofweek,我可能忽略了一些非常明显的事情,但为什么会这样: final Calendar calendar = Calendar.getInstance(Locale.GERMAN); System.out.println(calendar.getFirstDayOfWeek()); 导致 1 (Sunday) 而不是 2 (Monday) ? 在有人宣称“一周的第一天对所有讲德语的人来说都是星期天”(Sunday)之前,它是:“[D]是工作日的数字,从1到7,从星期一开始到星期天结束。” 事实上

我可能忽略了一些非常明显的事情,但为什么会这样:

final Calendar calendar = Calendar.getInstance(Locale.GERMAN);
System.out.println(calendar.getFirstDayOfWeek());
导致

1  (Sunday)
而不是

2 (Monday)
?

在有人宣称“一周的第一天对所有讲德语的人来说都是星期天”(Sunday)之前,它是:“[D]是工作日的数字,从1到7,从星期一开始到星期天结束。”

事实上,
Locale.dermany
的结果是正确的“星期一”


为什么一周的第一天是星期天,对于德语地区?

您自己回答了这个问题,在您的声明中,您使用德语而不是国家,将其更改为

 final Calendar calendar = Calendar.getInstance(Locale.GERMANY);

(注意,由于您没有更改使用默认语言的国家/地区)

特定语言的所有默认语言环境,例如
Locale.GERMAN
Locale.FRENCH
Locale.ENGLISH
将未指定的语言环境部分默认为USA。实际上,这些常量表示德语,住在美国的说法语或英语的人

这个问题可能没有很好的答案,因为仅仅了解语言还不足以理解一周的第一天。可能是因为Java是由一家美国公司为美国市场开发的,默认的语言环境值使用美国作为一个国家


如果你需要德国语言环境,请使用另一个答案所指出的
locale.dermany

问题不是“如何解决这个问题”,而是“为什么”?因为我担心我们讲德语的客户也可能会得到错误的日期。你是说默认的语言环境是
locale。德语不完全是这样。他们的语言环境可能是“de_de”,或“de_CH”,或“de_AT”或“de_LI”,也可能只是“de”?我担心如果“de”返回错误的值,即使没有德语国家将星期天作为一周的第一天,其他德语地区也可能返回错误的值。@SteffiS。我听到了。我环顾四周,但对于我来说,不清楚当只给出一种语言而不是一个国家时,
Calendar
会做什么。如果可以的话,最好尽可能准确地给出语言和国家。或者离开旧的
Calendar
类,转而使用更现代的java.time框架,我怀疑在任何地方都可以使用
de
作为默认语言环境。不过我理解你的担心。我建议你不要使用
日历。那门课设计得很糟糕,而且早已过时。相反,请使用中的
WeekFields
。您的代码的结果因Java版本而异(我可以很容易地在Java 10和11上重现,而不是在Java 8和9上重现)。您可以通过在命令行上设置系统属性
java.locale.providers
,例如
-Djava.locale.providers=HOST、COMPAT、CLDR
,来进一步控制它。