日历返回的数据不正确 API

Incorrect data returned by Calendar API

在我们的业务需求中,我们应该找出一周的第一天。

因为客户端是European所以我用下面的代码来获取它。

但是,问题是当我 运行 这段代码时,我得到 2 作为我期望的答案 1

public class Test{
    public static void main(String[] args) {
        TimeZone eu = TimeZone.getTimeZone("Europe/Berlin"); 
        Locale de = Locale.forLanguageTag("de"); 
        int firstDayOfWeek = Calendar.getInstance(eu, de).getFirstDayOfWeek(); 
        System.out.println(firstDayOfWeek);
    }
}

谁能帮我理解这种行为。

看看 docs:

Gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.

here

public static final int MONDAY 2

这表明 return 值取决于语言环境。

如果我们打印这个:

System.out.println(firstDayOfWeek == Calendar.MONDAY);

我们会看到 true。这意味着一周的第一天确实是星期一。只是你以为周一编码为1,其实周日编码为1。

根据 the javadoc,MONDAY 的值为 2。

    Locale de = Locale.forLanguageTag("de");
    WeekFields wf = WeekFields.of(de);
    DayOfWeek firstDayOfWeek = wf.getFirstDayOfWeek();
    System.out.println(firstDayOfWeek);

这会打印:

MONDAY

不要使用令人困惑的旧 Calendar class。你得到 2 作为一周的第一天。但是你不是应该得到 1 吗?还是0?星期几是如何编号的?忘记数字,使用 java.time 中的 DayOfWeek 枚举,现代 Java 日期和时间 API。

要获得更漂亮的输出,请使用 DayOfWeek.getDisplayNameDateTimeFormatter。如果确实需要数字,请使用 DayOfWeek.getValue:

    System.out.println(firstDayOfWeek.getDisplayName(TextStyle.FULL, de));
    System.out.println(firstDayOfWeek.getValue());

输出为:

Montag
1

PS 也不要使用 TimeZone 和其他过时的日期和时间 classes。 java.time 更好用。这个例子很好地展示了这个事实,但它很典型,当然不是巧合。

Link: Oracle tutorial: Date Time 解释如何使用 java.time.