Java ww SimpleDataFormat的奇怪行为

Java ww SimpleDataFormat的奇怪行为,java,parsing,simpledateformat,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.Y

有人能解释为什么我在解析日期时会得到这些值吗? 我尝试了三种不同的输入,如下所示:

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));
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));
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));
其输出:
02.2013
(如我所料)

2) 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));
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));
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));
输出:
52.2012
(这对我来说很好,因为2013年的第一周也是2012年的最后一周)

3) 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));
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));
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
(这对我来说绝对没有意义)


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

您使用的是
ww
,它是“一周中的一周”,但是
yyy
是“日历年”,而不是“周年”。设置一年中的一周,然后设置一年中的一周,这会导致一些问题,因为它们实际上只是单独的编号系统

您应该在格式字符串中使用
YYYY
来指定周-年。。。尽管不幸的是,看起来你无法以一种理智的方式获得价值。(我希望有一个
Calendar.WEEKYEAR
常量,但没有这样的东西。)

此外,年度周值从1开始,而不是从0开始。。。两周内没有一周;要么是2013年的第一周,要么是2012年的最后一周。。。不是两者都有

如果可能的话,我个人会尽量避免使用周-年和周-它们可能会非常混乱,特别是当一个日历年中的某个日期位于不同的周-年时。

用于将年值与
日历。年的周
字段同步。
在文档中有关于一年中的一周和一年中的一周的更多信息

谢谢,现在我意识到为什么会有yyyy和yyyyyth问题(如您所述)是因为我无法获取周年的值(我需要它,我只是解析字符串以验证它)。我是否应该发布另一个问题,看看是否有人知道我该怎么做?@fvdalcin:是的,发布另一个问题-但解释一下你的实际情况。您对“一年中的几周”的想法是否与
java.util.Calendar
的想法一致?您可能还需要考虑使用JoDA时间,它不仅使这些信息可用,而且在各个方面也是一个更好的日期/时间API。像这样:
2014-W19
。然后,库可以使用工厂内置的格式化程序帮助您解析和生成此类字符串。