Java 简化格式周计算
我用SimpleDataFormat得到了一些令人困惑的结果,我希望有人能对这个问题有所帮助。输出:Java 简化格式周计算,java,date,simpledateformat,Java,Date,Simpledateformat,我用SimpleDataFormat得到了一些令人困惑的结果,我希望有人能对这个问题有所帮助。输出: Time = Mon Dec 27 00:00:00 PST 2010 2010-01 <--- THIS IS WHAT I DON'T UNDERSTAND Start of week = Sun Dec 26 00:00:00 PST 2010 2010-01 End of Week = Sat Jan 01 23:59:59 PST 2011 2011-01
Time = Mon Dec 27 00:00:00 PST 2010
2010-01 <--- THIS IS WHAT I DON'T UNDERSTAND
Start of week = Sun Dec 26 00:00:00 PST 2010
2010-01
End of Week = Sat Jan 01 23:59:59 PST 2011
2011-01
背景:我在JasperReports中使用交叉表(日期分组为周)时发现了这一点
编辑:我使用的是JDK1.6.025
编辑:看来我必须使用Joda才能得到正确的结果。为了获得一周的开始/结束时间,我使用了:
LocalDate.withDayOfWeek
。为了检索年数和周数,我使用了DateTime.getWeekyear
和DateTime.getWeekOfWeekyear
标准java日期和时间类设计得不好,有时不能按预期工作。改用是的,这看起来是Java中的错误,而不是格式化代码中的错误。如果打印:
System.out.println("Week = " + calendar.get(Calendar.WEEK_OF_YEAR));
它还显示1
如果您将日期更改为不太接近年底的日期,例如:
calendar.set(2010, Calendar.NOVEMBER, 27);
然后输出看起来是正确的。顺便说一句,我使用Sun 1.6.0_25 64位虚拟机进行了测试。错误在于格式化代码,而不是Java 这种令人惊讶的行为是由于日期符号中的一条深奥规则造成的。请注意,ISO 8601(相当令人困惑)在使用周数时为年边界指定了不同的规则。特别是,当使用周数时,2010-12-27被视为2011年的一部分 因此,您应该使用“周-年”
YYYY
,而不是通常的年份yyy
。(请参见中的最后一个示例。)
此外,日期的标准符号使用显式的'W'
,因此您应该使用新的SimpleDataFormat(“yyy-'W'ww”)
编辑:还有一个问题。Java似乎默认使用非标准的日历
calendar.setMinimalDaysInFirstWeek( 4 );
为了得到正确的年份
编辑:通过阅读日历
javadocs,您可能还需要将开始日期设置为周一。此外,YYYY
格式说明符在Java1.7中似乎是新的。有鉴于此,除非您愿意升级到预发布的Java版本,否则我建议只使用Joda Time
一年中的第一周是包含第一个星期四的一周
年度最佳
因此,该行为与Java或Joda无关。这就是“一年中的一周”在全球范围内的实施方式(如果它们遵循ISO标准)+1,因为它在日期表示中提出了一个微妙的问题。请看下面我的回答。虽然你的陈述是正确的,但在这种情况下,应该没有任何区别。问题是“周数”是如何计算的。升级到Java 1.7是不可能的,所以我将不得不暂时使用Joda。
calendar.setMinimalDaysInFirstWeek( 4 );