【问题标题】:How to get the first day of week for a certain Locale / Country如何获得某个地区/国家/地区的第一天
【发布时间】:2018-09-17 10:01:29
【问题描述】:

我需要获取某个区域/国家/地区的一周的第一天。

我尝试使用以下代码找到它:

final Locale[] locales = new Locale[]{
        new Locale("en_GB"),
        new Locale("ru_RU"),
        new Locale("en_US"),                
        new Locale("es_ES"),
        new Locale("fr_FR"),        
        new Locale("iw_IL"),
        new Locale("he_IL")
};

for (final Locale locale : locales) {
    final Calendar cal = Calendar.getInstance(locale);
    final int firstDayOfWeek = cal.getFirstDayOfWeek();
    System.out.println(firstDayOfWeek);
}

这段代码的结果是,所有这些语言环境都在检索“1”,即星期日,而诸如 en_US 之类的语言环境应返回 2,即星期一。

【问题讨论】:

  • 我原以为美国是星期天,但英国和法国是星期一。
  • Calendar 类早已过时,而且设计总是很糟糕。你需要WeekFields.of(locale).getFirstDayOfWeek()。
  • 这对我有用:Locale.forLanguageTag("en-GB")(注意连字符而不是下划线)。文档:Creating a Locale.

标签: java date calendar locale


【解决方案1】:

分别传入两个参数——语言和国家——而不是带下划线的字符串。见Oracle Tutorial。

final Locale[] locales = new Locale[]{
        new Locale("en", "GB"),  // Pass language code, then country code, separately.
        new Locale("ru", "RU"),
        new Locale("en", "US"),
        new Locale("es", "ES"),
        new Locale("fr", "FR"),
        new Locale("iw", "IL"),
        new Locale("he", "IL")
    };

然后我会使用 Java8 来获取一周的第一天:

DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
System.out.println(firstDayOfWeek);

输出:

星期一

星期一

星期天

星期一

星期一

星期天

星期天

【讨论】:

【解决方案2】:

你在初始化Locale时出错了,你需要传递两个参数language和country。单参数构造函数仅适用于语言。

比如Locale("en_GB"),应该是Locale("en", "GB"),那么结果就是2。

顺便说一句,Locale("en", "US") 的结果是 1(星期日)。

【讨论】:

  • 非常正确的答案。但最好停止使用过时的Calendar 类。我永远不记得它是从星期日还是星期一开始计算天数,也不记得是从 0 还是 1,所以告诉我结果是 GB 为 2,US 为 1 并不能真正说服我,除非我深入研究文档以检查什么这些数字的意思。
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多