【问题标题】:Calendar#getFirstDayOfWeek() returns wrong valueCalendar#getFirstDayOfWeek() 返回错误值
【发布时间】:2019-07-08 13:45:11
【问题描述】:

我可能忽略了一些令人难以置信的显而易见的事情,但为什么会这样:

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

结果

1  (Sunday)

而不是

2 (Monday)

?

在有人声称“一周的第一天是所有讲德语的人的星期日”(again)之前,它是 not“[D] 是工作日编号,从 1 到 7,从星期一开始,到星期日结束。”

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

对于德语语言环境,为什么一周的第一天是星期日?

【问题讨论】:

  • 我建议你不要使用Calendar。该课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time APIWeekFields
  • 您的代码结果因 Java 版本而异(我可以很容易地在 Java 10 和 11 上重现,而不是在 8 和 9 上)。您可以通过在命令行中设置系统属性java.locale.providers来进一步控制它,例如-Djava.locale.providers=HOST,COMPAT,CLDR

标签: java calendar locale dayofweek


【解决方案1】:

特定语言的所有默认语言环境,例如Locale.GERMANLocale.FRENCHLocale.ENGLISH 默认未指定区域设置为美国。实际上,这些常数代表居住在美国的德语、法语或英语人士。

这个问题可能没有很好的答案,因为只知道语言不足以弄清楚一周的第一天。可能是因为 Java 是由一家美国公司为美国市场开发的,所以默认区域设置值使用美国作为国家/地区。

如果您需要德语语言环境,请使用 Locale.GERMANY,正如其他答案所指出的那样。

【讨论】:

    【解决方案2】:

    你自己回答了这个问题,在你的声明中你使用了德语而不是国家的语言环境,把它改成

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

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

    【讨论】:

    • 那么问题不是“我该如何解决这个问题”而是“为什么”?因为我担心我们的德语客户也可能会弄错日期。
    • 你是说默认语言环境是Locale.GERMANY
    • 不完全是。他们的语言环境可能是“de_DE”、“de_CH”、“de_AT”或“de_LI”,或者只是“de”?我担心如果“de”返回错误的值,即使没有德语国家将星期日作为一周的第一天,其他德语语言环境也可能返回错误的值。
    • @SteffiS。我听到你了。我环顾四周,但对我来说不清楚Calendar 在只给出一种语言而不是一个国家时会做什么。如果可以的话,最好尽可能准确地提供语言和国家/地区。或者放弃旧的 Calendar 类,转而使用更现代的 java.time 框架
    • 我怀疑只有de 会被用作任何地方的默认语言环境。不过,我理解你的担心。
    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2015-06-19
    • 2014-01-16
    • 2019-10-13
    • 2020-10-05
    相关资源
    最近更新 更多