У меня есть экземпляр GregorianCalendar для вторника 2 сентября. Значок проверяется в миллисекундах и в порядке. Я хочу еще один календарь, который будет в следующее воскресенье (7) в 23:59:59. Итак:GregorianCalendar: Прыжки со вторника по воскресенье
GregorianCalendar currentCalendar = MyClock.INSTANCE.getCurrentCalendar();
GregorianCalendar nextSunday =
(GregorianCalendar)currentCalendar.clone();
// GregorianCalendar uses Sunday as first day of week, so we must
// advance one week
int currentWeek = nextSunday.get(GregorianCalendar.WEEK_OF_YEAR);
nextSunday.set(GregorianCalendar.WEEK_OF_YEAR,
currentWeek + this.THIS_WEEK);
nextSunday.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.SUNDAY);
nextSunday.set(GregorianCalendar.HOUR_OF_DAY, 23);
nextSunday.set(GregorianCalendar.MINUTE, 59);
nextSunday.set(GregorianCalendar.SECOND, 59);
nextSunday.set(GregorianCalendar.MILLISECOND, 0);
Так, с воскресеньем день номер 1 недели для GregorianCalendar, и я на неделю года № 36, я добавляю одну неделю, а затем установить день в воскресенье.
Настоящие проблемы возникают сейчас: когда я выполняю свою машину разработки с OpenJDK 1.7.0_55, она работает отлично. Если я пойду на свою тестовую машину с OpenJDK 1.7.0_51, все будет неправильно:
Добавляет одну неделю до вторника 9-го, а затем отправляется в воскресенье 14-го вместо воскресного 7-го.
Я не знаю, правильно ли я это делаю: что меня действительно убивает, так это то, что результат зависит от машины, и я не нашел разницы в GregorianCalendar в этих версиях OpenJDK. Любое объяснение этого поведения?
PD: Пожалуйста, придерживайтесь GregorianCalendar. Я знаю, немного дерьмово, но я не хочу использовать календарь Joda или любой другой на современном этапе разработки.
EDIT: Я нашел метод setWeekDate (год, week_of_year, day_of_week). Можно было бы подумать, что установка года, недели и дня недели в один и тот же метод даст ему успех. Это не происходит: все еще идет со 2-го по 14-е. Что обезьяна написала это?
Когда вы выполняете 'get' после установки своих значений? Установка значений в 'Calendar' ставит их в очередь' set', но они не вычисляются до вызова 'get'. – Compass
FYI, как Joda-Time, так и класс 'Calendar' теперь вытесняются классами * java.time *, встроенными в Java 8 и более поздние версии. Кроме того, подсказка: найдите «Half-Open», чтобы узнать о лучшем методе, используя начало следующего дня, а не определять последний момент дня, например: 23:59:59. –