【发布时间】:2011-07-19 20:55:35
【问题描述】:
我在使用 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
编辑:看来我必须使用 Joda 才能获得正确的结果。为了获得一周的开始/结束,我最终使用了:LocalDate.withDayOfWeek。为了检索年份和周数,我使用了DateTime.getWeekyear 和DateTime.getWeekOfWeekyear。
【问题讨论】:
-
+1 用于提出日期表示中的一个微妙问题。请参阅下面的答案。
标签: java date simpledateformat