Java Calendar WEEK_OF_YEAR不符合ISO-8601标准?

Tul*_*ova 9 java iso date

ISO-8601标准规定了这一点

"一年的第一周是包含一年中第一个星期四的一周(因此,总是包含1月4日)."

这意味着一年中的第一周不是包含1月1日的那一周,而是包含在新年四天的第一个星期.

根据周一,2016年1月11日是第2周.以下是2016年的周数列表.

Ubuntu在其时间小部件中反映出:

在此输入图像描述

而且cal命令也有:

在此输入图像描述

Oracle使用"iw"参数支持它TO_CHAR:

> select to_char(to_date('11/01/2016','dd/mm/yyyy'),'iw') weekno from dual;
> WEEKNO
    02
Run Code Online (Sandbox Code Playgroud)

但Java表示2016年1月11日星期一是第3周

Calendar c = Calendar.getInstance();
System.out.println(c.getTime());
System.out.println(c.get(Calendar.WEEK_OF_YEAR));

Output:
Mon Jan 11 09:02:35 VET 2016
3
Run Code Online (Sandbox Code Playgroud)

Java认为一年中的第一周是包含1月1日的那一周.

- Java是否有办法使用符合ISO-8601标准的周编号?

har*_*ldK 7

正如我在评论中指出的那样,默认行为是特定于语言环境的.一些语言环境会给出3,有些会给出2.

幸运的是,您可以指定一年中第一周必须出现的天数Calendar.正如您在上面所写,对于ISO 8601,这个数字是4,因此以下代码应该工作:

Calendar c = Calendar.getInstance();
c.setMinimalDaysInFirstWeek(4); // For ISO 8601
System.out.println(c.getTime());
System.out.println(c.get(Calendar.WEEK_OF_YEAR));
Run Code Online (Sandbox Code Playgroud)

无论语言环境如何,这都应该使输出正确.

测试输出:

Mon Jan 11 14:54:22 CET 2016
2
Run Code Online (Sandbox Code Playgroud)