【问题标题】:Incorrect data returned by Calendar APICalendar API 返回的数据不正确
【发布时间】:2018-10-27 07:08:18
【问题描述】:

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

由于客户端是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);
    }
}

谁能帮我理解这种行为。

【问题讨论】:

标签: java calendar dayofweek java.util.calendar


【解决方案1】:

docs

获取一周的第一天是什么;例如,美国的星期天,法国的星期一。

here:

public static final int MONDAY 2

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

如果我们打印这个:

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

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

【讨论】:

    【解决方案2】:
        Locale de = Locale.forLanguageTag("de");
        WeekFields wf = WeekFields.of(de);
        DayOfWeek firstDayOfWeek = wf.getFirstDayOfWeek();
        System.out.println(firstDayOfWeek);
    

    打印出来:

    星期一

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

    对于更漂亮的输出,使用DayOfWeek.getDisplayNameDateTimeFormatter。如果您确实需要号码,请使用DayOfWeek.getValue

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

    输出是:

    Montag
    1
    

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

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

    【讨论】:

      【解决方案3】:

      根据the javadoc,MONDAY 的值为 2。

      【讨论】:

        猜你喜欢
        • 2022-12-02
        • 2013-09-15
        • 2019-11-22
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        相关资源
        最近更新 更多