ww SimpleDateFormat的奇怪行为

时间:2014-05-08 12:48:12

标签: java parsing simpledateformat

任何人都可以解释为什么我在尝试解析日期时会获得这些值? 我尝试了三种不同的输入,如下所示:

1)2013年第三周

Date date = new SimpleDateFormat("ww.yyyy").parse("02.2013");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR));

哪些输出:02.2013(正如我所料)

2)2013年第一周

Date date = new SimpleDateFormat("ww.yyyy").parse("00.2013");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR));

哪个输出:52.2012(这对我来说很好,因为2013年的第一周也是2012年的最后一周)

3)2013年第二周

Date date = new SimpleDateFormat("ww.yyyy").parse("01.2013");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR));

哪个输出:1.2012(这对我来说绝对没有感觉)

有谁知道为什么会这样?我需要以格式(一周中的一周)解析日期。(年)。我使用了错误的模式吗?

2 个答案:

答案 0 :(得分:16)

您正在使用ww,这是"周 - 周",然后是yyyy,这是"日历年"而不是"周年"。设置星期一年然后设置日历年是问题的一个方法,因为它们只是有效地分开编号系统。

您应该在格式字符串中使用YYYY来指定周年...但不幸的是,您似乎无法获取值办法。 (我期待Calendar.WEEKYEAR常数,但没有这样的事情。)

此外,周年价值从1开始,而不是0 ......并且没有一周是两周 - 年; 它是2012年的最后一周...它不是两者兼而有。

如果可能的话,我个人会避免使用一周和几周 - 他们可能会非常混乱,特别是当一个日历年的日期是在不同的一周时。

答案 1 :(得分:2)

使用Calendar.getWeekYear()将年份值与Calendar.WEEK_OF_YEAR字段同步。 有关GregorianCalendar doc的年周和周年的更多信息。