Вычисления 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

Должен ли я рассматривать последнюю «неделю» года, которая продолжается до следующего года, как особый случай? Или это правильный способ интерпретировать это? Очевидно, что при попытке организовать неделю последовательно, порядок неверен. Корректируя исходные значения, 25 декабря 2005 г. считается 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.

РЕДАКТИРОВАТЬ: I я использую JDK 1.6.0_25

РЕДАКТИРОВАТЬ: Кажется, мне придется использовать Joda, чтобы получить правильный результат. Чтобы получить начало / конец недели, я использовал: LocalDate.withDayOfWeek . Чтобы получить год и номер недели, я использовал DateTime.getWeekyear и DateTime.getWeekOfWeekyear .

8
задан nevets1219 19 July 2011 в 22:19
поделиться