2014-12-09 1 views
3

У меня есть экземпляр 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-е. Что обезьяна написала это?

+0

Когда вы выполняете 'get' после установки своих значений? Установка значений в 'Calendar' ставит их в очередь' set', но они не вычисляются до вызова 'get'. – Compass

+0

FYI, как Joda-Time, так и класс 'Calendar' теперь вытесняются классами * java.time *, встроенными в Java 8 и более поздние версии. Кроме того, подсказка: найдите «Half-Open», чтобы узнать о лучшем методе, используя начало следующего дня, а не определять последний момент дня, например: 23:59:59. –

ответ

2

Я сделал небольшие изменения в код:

SimpleDateFormat sdf = new SimpleDateFormat("dd MM yyyy - HH:mm:ss.SSSS Z"); 
GregorianCalendar currentCalendar = (GregorianCalendar) Calendar.getInstance(); 
currentCalendar.set(Calendar.DAY_OF_MONTH, 2); 
System.out.println(sdf.format(currentCalendar.getTime())); 
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 + 1); 
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); 
System.out.println(sdf.format(nextSunday.getTime())); 

Воспроизводит:

02 12 2014 - 19:40:46.0250 +0200 
07 12 2014 - 23:59:59.0000 +0200 

Который является правильным. Тем не менее, у меня есть две вещи, которые следует указать:

  1. проверить значение this.THIS_WEEK. Я заменил его на значение 1, и он работает нормально на моей машине.
  2. проверить часовой пояс на обеих машинах (в моем случае GMT ​​+ 2). Поскольку обе машины используют тот же код, который и инициализирует значения, и использует их, не должно быть проблем. Но если вы используете значения в миллисекундах на другом компьютере (например, выставляете значение через веб-сервис или что-то еще), вы можете столкнуться с проблемами.
0

Я бы попытался использовать java.util.Calendar метод add (int field, int amount) вместо этого.

nextSunday.add (Calendar.DAY_OF_MONTH, 5). Одна строка кода вместо трех.

 Смежные вопросы

  • Нет связанных вопросов^_^