Я использую метод compareTo в Java, чтобы попытаться проверить, превышает ли определенную дату или равно 24 часам после другой даты.
Ответ 3
TL;DR
myUtilDate_B
.toInstant()
.equals(
myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS )
) // Exactly 24 hours apart.
... и...
myUtilDate_B
.toInstant()
.isAfter(
myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS )
) // Over 24 hours apart.
С другой стороны...
Duration.between( myUtilDate_A , myUtilDate_B )
.compareTo( Duration.ofHours( 24 ) )
// Returns 0 if exactly 24 hours apart,
// >0 if over 24 hours apart.
java.time
Вы специально попросили сравнить два периода времени, чтобы спросить, есть ли:
- Это ровно на 24 часа позже другого
- Это более чем на 24 часа позже другого.
Метод compareTo
, о котором вы упомянули, не делает этого. Он предназначен только для того, чтобы сказать, является ли момент одним и тем же, позже или раньше. Метод не заботится о конкретных промежутках времени, таких как 24 часа.
Вы конкретно заявили, что дата не имеет значения. Поэтому вы хотите игнорировать аномалии, такие как летнее время (DST), которые делают день более длинным или короче 24 часов.
Итак, мы можем работать в UTC. Нет необходимости в часовых поясах.
Если вы ссылались на объекты java.util.Date
, сначала конвертируйте их в объекты java.time. Класс Date
является частью проблемных старых классов времени и времени, а также Calendar
, которые теперь являются устаревшими, вытесняются классами java.time.
Эквивалент java.util.Date
равен java.time.Instant
. Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунды (до девяти (9) цифр десятичной дроби).
Вы можете конвертировать в/из типов java.time с помощью новых методов, добавленных в старые классы.
Instant start = myUtilDate_Start.toInstant();
Instant stop = myUtilDate_Stop.toInstant();
Определите пробел, о котором мы заботимся, в этом случае двадцать четыре часа, как объект Duration
.
Duration d = Duration.ofHours( 24 ); // We mean literally 24 hours, not a day.
Используйте Duration
для вычисления значения 24 часа. Определите единицы часов с помощью ChronoUnit
enum.
Instant target = start.plus( 24 , ChronoUnit.HOURS );
Наконец, сравните второе значение даты-времени. Вызовите equals
и isAfter
.
Boolean isExactly24HoursLater = stop.equals( target );
Boolean isOver24HoursLater = stop.isAfter( target );
О java.time
Структура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятный старый legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советует перейти на java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
- Java SE 8 и SE 9 и позже
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональных возможностей java.time обратно переносится на Java 6 и 7 в ThreeTen-Backport.
- Android
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.
Joda времени
UPDATE: Проект Joda-Time, теперь в режим обслуживания, советует перейти на классы java.time. Этот раздел оставлен здесь неповрежденным для истории.
Joda-Time упрощает эту работу.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTimeInQuestion = new DateTime( 2014, 1, 2, 3, 4, 5, 6, timeZone ); // Or: new DateTime( someJavaDotUtilDotDateObject );
DateTime now = new DateTime( timeZone );
DateTime twentyFourHoursFromNow = now.plusHours( 24 ); // Ignores Daylight Saving Time (DST). If you want to adjust for that, call: plusDays( 1 ) instead.
DateTime isDateTimeInQuestionAfter24HoursFromNow = dateTime.isAfter( twentyFourHoursFromNow );
1 день ≠ 24 часа
Если вы действительно хотели рассмотреть тот же время настенных часов следующего дня, вызовите plusDays( 1 )
, а не plusHours( 24 )
. Затем Joda-Time настраивается на летнее время (DST) или другие аномалии. Например, здесь, в Соединенных Штатах, это может означать 25 часов, а не 24 часа из-за нашей 1-часовой глупости DST.
Сравнить в течение 24 часов
Если вы действительно хотите проверить, подходит ли указанное время в течение этого 24-часового промежутка времени, используйте один из трех классов Joda-Time для промежутков времени: интервал, продолжительность и период.
Interval interval = new Interval( now, twentyFourHoursFromNow );
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains( dateTimeInQuestion );
Для такого сравнения Joda-Time использует логику "Half-Open". Это означает, что начальная дата-время включена, в то время как окончание является эксклюзивным. Другими словами, сравнение для БОЛЬШЕ ЧЕМ ИЛИ РАВНО ( > =) начало, но МЕНЬШЕ (<) конец. Этот подход обычно имеет наибольший смысл при работе с датой.