0

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

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

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

4

3 回答 3

3

查看文档

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

这里:

public static final int 星期一 2

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

如果我们打印这个:

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

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

于 2018-05-17T06:04:25.037 回答
1
    Locale de = Locale.forLanguageTag("de");
    WeekFields wf = WeekFields.of(de);
    DayOfWeek firstDayOfWeek = wf.getFirstDayOfWeek();
    System.out.println(firstDayOfWeek);

这打印:

周一

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

对于更漂亮DayOfWeek.getDisplayName的输出使用或DateTimeFormatter. 如果您确实需要一个号码,请使用DayOfWeek.getValue

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

输出是:

Montag
1

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

链接: Oracle 教程:日期时间解释如何使用java.time.

于 2018-05-17T06:54:26.337 回答
0

根据javadoc,星期一的值为 2。

于 2018-05-17T06:06:23.400 回答