есть предложения по решению такой проблемы? Используйте java.time
Я согласен с вами, что в вашем коде есть некоторые сюрпризы. Возможно, вы предполагали следующее:
ZoneId zone = ZoneId.of("Asia/Kolkata");
ZonedDateTime zdt = ZonedDateTime.now(zone);
ZonedDateTime zdt1 = ZonedDateTime.now(zone);
zdt = zdt.withHour(14);
zdt1 = zdt1.withHour(13);
System.out.println(zdt.isAfter(zdt1) + " zdt " + zdt + " zdt1 " + zdt1);
zdt = zdt.withDayOfMonth(ZonedDateTime.now(zone).getDayOfMonth());
System.out.println(zdt.isAfter(zdt1) + " zdt " + zdt + " zdt1 " + zdt1);
Вывод, когда я только что запустил код:
true zdt 2019-09-30T14:44:13.630029+05:30[Asia/Kolkata] zdt1 2019-09-30T13:44:13.630362+05:30[Asia/Kolkata]
true zdt 2019-09-30T14:44:13.630029+05:30[Asia/Kolkata] zdt1 2019-09-30T13:44:13.630362+05:30[Asia/Kolkata]
Я получаю true
оба раза так же, как вы получилииз вашего кода, что не должно удивлять. Как уже говорили другие, 02: 55h - после 01: 55h, а 30 октября - после 01 октября. Также, ссылаясь на мой результат, 14:44 - после 13:44. В обеих строках эти два раза сравниваются.
Я использую java.time, современный Java-интерфейс даты и времени.
Что пошло не так в вашем коде?
сюрпризы в вашем коде проистекают из того, что класс Calendar
плохо спроектирован и часто ведет себя не так, как мы ожидаем.
- Почему, когда вы устанавливаете час на 14, вы получаете Tue Oct 01 02:55:16 IST 2019? Дата изменилась на следующий месяц, и час дня равен 2, а не 14.
- Почему, когда вы устанавливаете дату на сегодняшнюю дату, 30 сентября, вы получаете 30 октября?
Для 1., Calendar.HOUR
относится к часу в AM или PM от 0 до 11. Поэтому, установив его на 14, мы должны были ожидать исключения. A Calendar
со стандартными настройками не волнует. Поскольку время уже было в PM, оно экстраполируется, поэтому 14:00 становится 2:00 на следующий день. Поскольку сегодня последний день сентября, вы получаете 1 октября.
Для 2. Calendar.DATE
относится не к полной дате, а к дню месяца. Поскольку текущим днем месяца является 30, и у нас уже был 1 октября, мы получаем 30 октября.
Короче говоря: Избегайте класса Calendar
. Используйте ZonedDateTime
и / или другие классы из java.time, современного Java-API даты и времени. С ними гораздо приятнее работать и преподносить гораздо меньше сюрпризов, чем те, с которыми вы столкнулись.
Ссылка
Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.