Alex Rivera | Logout

SimpleDateFormat Week Calculations

Asked 2011-07-19T20:55:35.163
9

I'm getting some puzzling results with SimpleDateFormat and am hoping that someone can shed some light on the issue. The output:

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

Should I be treating the last "week" of the year that extends to the next year as a special case? Or is this the correct way to interpret this? Obviously when attempting to organize week sequentially, the order is incorrect. Adjusting the initial values, Dec 25, 2005 is considered the 53rd week. I haven't looked at Joda yet to see if Joda produces similar results.

The relevant code:

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 ) );

Background: I found this when using the crosstab (date grouped into week) in JasperReports.

EDIT: I

Edit
Report

2 Answers

2

From ISO Week

The first week of a year is the week that contains the first Thursday of the year.

So the behavior has nothing to do with Java or Joda. This is how the "week of the year" is implemented worldwide (if they follow the ISO standard)

answered 2011-07-20T04:58:32.760
-2

Yes, this looks to be a bug in Java, and not in the formatting code. If you print:

System.out.println("Week = " + calendar.get(Calendar.WEEK_OF_YEAR));

It also shows 1.

If you change your date to something not so close to the end of the year, eg:

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

Then the output looks right. BTW, I tested using Sun 1.6.0_25 64bit VM.

answered 2011-07-19T21:50:23.903

Your Answer