Я получаю некоторые удивительные результаты с 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.
РЕДАКТИРОВАТЬ: Я использую JDK 1.6.0_25
РЕДАКТИРОВАТЬ: Кажется, мне придется использовать Joda, чтобы получить правильный результат.Чтобы получить начало / конец недели, я использовал: LocalDate.withDayOfWeek
.Чтобы получить номер года и недели, я использовал DateTime.getWeekyear
и DateTime.getWeekOfWeekyear
.