1

日历 API 让我很困惑。我正在尝试做的事情似乎很简单,但似乎并不适合我。

我想将一周的第一天设置为星期一,而不是默认的星期日(我知道它因区域设置而异,但我想始终强制执行星期一)。最重要的是,对于给定的日期,我想检索它所代表的星期几(例如,1 代表星期一,7 代表星期日)。

有没有办法使用默认的日历 API 来做到这一点?我试过类似的东西:

Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.setTime(<some Date object that's a monday>);
System.out.println(cal.get(Calendar.DAY_OF_WEEK));

它给了我 2,而不是 1。我怀疑这是因为它给了我 的值Calendar.MONDAY,但我不完全确定。基于这种怀疑,以下方法确实有效:

Calendar cal = Calendar.getInstance();
cal.setTime(<some Date object that's a monday>);
System.out.println(
    (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) ? 
        7 : cal.get(Calendar.DAY_OF_WEEK) - 1);

...但我宁愿没有那个 if 语句。有没有办法用直接的日历 API 做我想做的事?

4

2 回答 2

2

查看日历源,似乎 setFirstDayOfWeek 实际上只影响 WEEK_OF_MONTH 和 WEEK_OF_YEAR 计算。无论您的一周从哪一天开始,MONDAY 仍然是 MONDAY,并且在日历中 MONDAY 的值为 2。

于 2013-03-27T18:09:45.407 回答
0

块引用

一周的第一天派生自当前语言环境。如果不设置日历的区域设置(Calendar.getInstance(Locale) 或 new GregorianCalendar(Locale)),它将使用系统的默认值。系统的默认值可以被 JVM 参数覆盖:

public static void main(String[] args) { Calendar c = new GregorianCalendar(); System.out.println(Locale.getDefault() + ":" + c.getFirstDayOfWeek()); }

这应该显示具有不同 JVM 参数的语言/国家/地区的不同输出:

-Duser.language=en -Duser.country=US -> en_US: 1 (Sunday)
-Duser.language=en -Duser.country=GB -> en_GB: 2 (Monday)

不要忘记这也可能改变其他行为(u)r。

块引用

详细信息可以在以下链接中找到

如何使用 JVM 参数为 java.util.Calendar 指定 firstDayOfWeek

于 2013-03-27T18:10:26.360 回答