Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简化格式周计算_Java_Date_Simpledateformat - Fatal编程技术网

Java 简化格式周计算

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

我用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
背景:我在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 );