SimpleDateFormat周计算

我用SimpleDateFormat得到一些令人费解的结果,并希望有人可以阐明这个问题。输出:

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

我是否应该将一年的最后一个“周”视为特例?还是这是正确的解释方式?显然,当尝试顺序组织一周时,顺序是不正确的。调整初始值后,2005年12月25日被视为第53周。我还没有看过Joda,看看Joda是否产生类似的结果。

相关代码:

private static Date getStartOfWeek( Date d ) {

Calendar calendar = Calendar.getInstance();

calendar.clear();

calendar.setTime( d );

calendar.set( Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek() );

return calendar.getTime();

}

private static Date getEndOfWeek( Date d ) {

Calendar calendar = Calendar.getInstance();

calendar.clear();

calendar.setTime( d );

calendar.add( Calendar.WEEK_OF_YEAR, 1 );

calendar.set( Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek() );

calendar.add( Calendar.MILLISECOND, -1 );

return calendar.getTime();

}

Calendar calendar = Calendar.getInstance();

calendar.clear();

calendar.set( 2010, Calendar.DECEMBER, 27 );

Date d = calendar.getTime();

Date start = getStartOfWeek( d );

Date end = getEndOfWeek( d );

SimpleDateFormat fmt = new SimpleDateFormat( "yyyy-ww" );

System.out.println( "Time = " + d );

System.out.println( fmt.format( d ) );

System.out.println( "Start of week = " + start );

System.out.println( fmt.format( start ) );

System.out.println( "End of Week = " + end );

System.out.println( fmt.format( end ) );

背景:我在JasperReports中使用交叉表(分组为星期的日期)时发现了这一点。

编辑:我正在使用JDK 1.6.0_25

编辑:看来,我将不得不使用乔达来获得正确的结果。为了开始/结束一周,我最终使用了:LocalDate.withDayOfWeek。要检索年和周号,我使用DateTime.getWeekyearDateTime.getWeekOfWeekyear

回答:

该错误位于您的格式化代码中,而不是Java中。

令人惊讶的行为是由于日期符号中的一个深奥的规则。请注意,在使用周数时,ISO

8601(而不是令人困惑)为年份边界指定了不同的规则。特别是,当使用周数时,2010-12-27被认为是2011年的一部分。

因此,您应该使用“星期”

YYYY而不是通常的年份yyyy。(见http://download.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html#week_year,并在最后一个例子http://download.oracle.com/javase/7/docs/

api / java / text /

SimpleDateFormat.html。)

另外,日期的标准符号使用显式'W',因此您应该使用new SimpleDateFormat( "YYYY-'W'ww" )

编辑:还有另一个问题。Java似乎默认为非标准的calendar.getMinimalDaysInFirstWeek() == 1,因此您必须设置

calendar.setMinimalDaysInFirstWeek( 4 );

为了得到正确的年份。

编辑:从阅读Calendarjavadocs,您可能 需要将开始日期设置为星期一。此外,YYYY格式说明符似乎在Java

1.7中是新的。有鉴于此,除非您愿意升级到Java的预发行版本,否则我建议您仅使用Joda Time。

以上是 SimpleDateFormat周计算 的全部内容, 来源链接: utcz.com/qa/428933.html

回到顶部