Java: GregorianCalendar возвращает неверные данные - PullRequest
1 голос
/ 25 августа 2011

Я хочу вычислить понедельник определенного номера недели в году.Вот как я это делаю:

final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date

Это должно вернуть 14 мая 2012 года (14.05.12 в немецком формате), но оно возвращает 16 мая 2012 года, но это неправильно.

Таким образом, для 2012 года его +2, 2011 год правильный, а 2010 год -1.

Почему GregorianCalendar вычисляет неверную дату?

Заранее благодарим и приветствуем из Германии.

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Это будет зависеть от того, что возвращает getFirstDayOfWeek (), а также от того, на какой день наступает 1 января.

Из Javadocs:

Значения, рассчитанные для диапазона полей WEEK_OF_YEAR от 1 до 53. Неделя 1 за год - это самый ранний семидневный период, начинающийся с getFirstDayOfWeek (), который содержит по крайней мере getMinimalDaysInFirstWeek () дней с этого года. Таким образом, это зависит от значений getMinimalDaysInFirstWeek (), getFirstDayOfWeek () и день 1 января. Недели между 1-й неделей года и 1-й неделей в следующем году нумеруются последовательно от 2 до 52 или 53 (как требуется).

Например, 1 января 1998 года был четверг. Если getFirstDayOfWeek () Понедельник и getMinimalDaysInFirstWeek () равен 4 (это значения отражая ISO 8601 и многие национальные стандарты), затем неделя 1 1998 года начинается 29 декабря 1997 г. и заканчивается 4 января 1998 г. Если, однако, getFirstDayOfWeek () - воскресенье, затем первая неделя 1998 года начинается в январе 4, 1998 и заканчивается 10 января 1998 г .; первые три дня 1998 года затем часть недели 53 1997 года.

1 голос
/ 25 августа 2011

Попробуйте установить DAY_OF_WEEK тоже:

final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY ); //set day to monday
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date

Возвращает 14.05.12, 16.05.11 и 17.05.10 для меня.

Редактировать:

Таким образом, для 2012 года его +2, 2011 год является правильным, а 2010 год равен -1.

Если я правильно понимаю, вы получите 16.05.10, 16.05.11 и 16.05.12, верно?Это означает, что часть календаря используется повторно.Вы, случайно, тестировали подряд, начиная с 2011 года?Если это так, то изменение года без указания clear() и т. Д. Сохранит ранее рассчитанную дату.

...