DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyyww");
dateTimeFormatter.print(new DateTime(2016, 1, 1, 1, 1).withZone(DateTimeZone.UTC))
返回201653
为什么是2016年的53周而不是2015年?
您要查找的是基于周的年份(符号 x),而不是纪元年份(符号 y)。另请参阅Joda-Time使用的模式语法,该语法与SimpleDateFormat
或Java-8的模式语法不同。因此,解决方案应如下所示:
DateTimeFormatter f = DateTimeFormat.forPattern("xxxxww");
String s = f.print(new DateTime(2016, 1, 1, 1, 1).withZone(DateTimeZone.UTC));
System.out.println(s); // 201553
因为1月1日是星期五。在这种情况下,该周算作 2015 年的最后一周,2016 年的第一周将从第一个星期一(1 月 4 日)开始。
这是根据ISO 8601标准实施的:
对第 01 周有几种相互等效和兼容的描述:
- 包含一年第一个星期四的一周(正式的ISO定义),
- 1月4日的一周,
- 第一周,其大部分时间(四天或更多)在开始年份,以及
- 从12月29日至1月4日期间的星期一开始的一周。