Calendar API返回的数据不正确

时间:2018-05-17 05:57:21

标签: java calendar dayofweek java.util.calendar

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

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

有人可以帮助我理解这种行为。

3 个答案:

答案 0 :(得分:3)

查看docs

  

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

here

  

public static final int MONDAY 2

这表明返回值取决于区域设置。

如果我们打印出来:

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

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

答案 1 :(得分:1)

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

打印:

  

MONDAY

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

要获得更漂亮的输出,请使用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

答案 2 :(得分:0)

根据the javadoc,星期一的价值是2。