Как сравнивать даты в java

Сравнение дат в Java

В этом руководстве мы сосредоточимся на том, как сравнивать даты с помощью API даты и времени Java 8. Мы рассмотрим разные методы, чтобы проверить, равны ли две даты и как сравнивать даты.

2. Сравнение дат

Основной способ выразить дату в Java — LocalDate . Давайте рассмотрим два экземпляра объекта LocalDate , представляющие 10 августа 2019 года и 1 июля 2019 года:

Мы собираемся сравнить два объекта LocalDate , используя методы isAfter () , isBefore () и isEqual (), а также equals () и compareTo () .

Мы используем метод isAfter (), чтобы проверить, находится ли экземпляр даты после другой указанной даты. Следовательно, следующее утверждение JUnit пройдет:

Аналогично, метод isBefore () проверяет, находится ли экземпляр даты раньше другой указанной даты:

Метод isEqual () проверяет, представляет ли дата ту же точку на местной шкале времени, что и другая указанная дата:

2.1. Сравнение дат с использованием сравнительного интерфейса

Метод equals () даст тот же результат, что и isEqual () , но только если переданный аргумент имеет тот же тип (в данном случае LocalDate ):

IsEqual () метод может быть использован вместо того, чтобы сравнить с объектами другого типа, таких как JapaneseDate , ThaiBuddhistDate и т.д.

Мы можем сравнить два экземпляра даты, используя метод compareTo () , как определено интерфейсом Comparable :

3. Сравнение экземпляров даты, содержащих компонент времени

В этом разделе объясняется, как сравнить два экземпляра LocalDateTime . Экземпляры LocalDateTime содержат дату, а также компонент времени.

Аналогично LocalDate , мы сравниваем два экземпляра LocalDateTime с методами isAfter () , isBefore () и isEqual () . Кроме того, equals () и compareTo () можно использовать аналогично тому, как описано для LocalDate.

Точно так же мы можем использовать одни и те же методы для сравнения двух экземпляров ZonedDateTime . Давайте сравним 8:00 по местному времени в Нью-Йорке и 14:00 по местному времени в Берлине в один и тот же день:

Хотя оба экземпляра ZonedDateTime представляют один и тот же момент времени, они не представляют одинаковые объекты Java. У них внутри разные поля LocalDateTime и ZoneId :

4. Дополнительные сравнения

Давайте создадим простой служебный класс для более сложных сравнений.

Во-первых, мы проверим, находятся ли экземпляры LocalDateTime и LocalDate в один и тот же день:

Во-вторых, мы проверим, находятся ли два экземпляра LocalDateTime в один и тот же день:

Метод truncatedTo (TemporalUnit) усекает дату на заданном уровне , которым в нашем примере является день.

В-третьих, мы можем реализовать сравнение на уровне часа:

Наконец, аналогичным образом мы можем проверить, происходят ли два экземпляра ZonedDateTime в течение одного часа:

Мы видим, что два объекта ZonedDateTime на самом деле происходят в течение одного часа, даже если их местное время отличается (8:30 и 14:00 соответственно):

5. Сравнение в старом Java Date API

До Java 8 нам приходилось использовать классы java.util.Date и java.util.Calendar для управления информацией о дате / времени. Дизайн старого Java Date API имеет много недостатков, например, он сложен и небезопасен для потоков. Java.util.Date экземпляр представляет собой «момент времени» , а не реальная дата.

Одним из решений было использование библиотеки Joda Time. С момента выпуска Java 8 рекомендуется перейти на API даты и времени Java 8.

Подобно LocalDate и LocalDateTime , объекты java.util.Date и java.util.Calendar имеют методы after () , before () , compareTo () и equals () для сравнения двух экземпляров даты . Даты сравниваются как моменты времени на уровне миллисекунды:

Для более сложных сравнений мы можем использовать DateUtils из библиотеки Apache Commons Lang. Этот класс содержит множество удобных методов для работы с объектами Date и Calendar :

Чтобы сравнить объекты даты, происходящие из разных API, мы должны сначала выполнить правильное преобразование, а только потом применить сравнение. Мы можем найти более подробную информацию в нашем руководстве по преобразованию даты в LocalDate или LocalDateTime и обратно.

6. Заключение

В этой статье мы изучили различные способы сравнения экземпляров даты в Java.

Классы Java 8 Date / Time имеют богатые API-интерфейсы для сравнения дат с указанием времени и часовыми поясами или без них. Мы также видели, как сравнивать даты с точностью до дня, часа, минуты и т. Д.

Все фрагменты кода, упомянутые в статье, включая дополнительные примеры, доступны на GitHub.

Как лучше сравнивать перечисляемые типы в Java

Недавно на Stack Overflow я наткнулся на, казалось бы, простой вопрос:

Что лучше использовать для сравнения enum’ов — == или equals() ?

Вы, конечно, можете сходу ответить, что никакой разницы нет, но будете неправы — в ответах к этому вопросу было приведено много интересных аргументов в пользу обоих вариантов. Я решил, что будет интересно перевести этот спор на русский язык.

Они же оба работают, верно?

Да. Как написано в документации, «допустимо использовать оператор == вместо метода equals , если доподлинно известно, что хотя бы один из них ссылается на перечислимый тип» («it is permissible to use the == operator in place of the equals method when comparing two object references if it is known that at least one of them refers to an enum constant»). Причина этого очень простая — каждый из объектов enum’а создаётся только единожды, и поэтому, если вы создадите десять переменных равных SomeEnum.RED , они все будут ссылаться на один и тот же объект (а оператор == как раз это и проверяет).

Какие есть преимущества у оператора ==?

  • Он никогда не выбросит NullPointerException :
  • В одном из ответов приводилась цитата Джошуа Блоха (автор книги «Effective Java»; видимо, и цитата оттуда) о том, что этот оператор работает быстрее, и если гарантируется уникальность каждого экземпляра класса, то стоит использовать именно его.
  • Как известно, сравнения через == проверяются на соответствия типов во время компиляции (это хорошо, т.к. поможет вовремя выявить ошибку):
  • Этот вариант короче, и сразу понятно, что происходит именно проверка равенства (т.е. вариант более читаемый).

Ого, как серьёзно все подошли к вопросу! Ну теперь точно буду использовать оператор равенства.

Не спешите так. Не все единогласно за == . Вот что пишут сторонники equals() :

Сравнение дат

Здравствуйте!
Подскажите пожалуйста как сравнить 2 даты.
Одну мы имеем, а вот вторую надо вводить с клавиатуры.
Я использовал такой код для ввода даты:

Заданная дата забита, как cal
Надо сравнить эти даты, и если вводимая больше/меньше/равна заданной выводить различные сообщения.

Собственное вопрос, как их сравнить? Может, стоит задать как-то по другому вводимую дату, и если да, то как?
Заранее благодарю, особенно если напишите код со сравнением.

Сравнение дат
Как можно сравнить две даты? Есть два поля для ввода JTextField, в котором маска dd-mm-yyyy (день.

Сравнение двух дат в JAVA
Здравствуйте! Имеется массив, в котором находится города, температура воздуха в данных городах и.

Сравнение дат файлов класса File и класса FTPFile
Всем доброго времени суток! Подскажите, пожалуйста, как сравнить дату изменения файла объекта типа.

Дополните пожалуйста эти методы! скалярное произведение векторов, умножение на скаляр, сравнение векторов, сравнение
public class VectorTricks

Как сравнить даты в Java?

date3 всегда больше date1 а date1 – сегодня. Как проверить, соответствует ли сегодняшняя дата между датой 1 и датой 3?

Дата имеет до и после методов и может сравниваться друг с другом следующим образом:

Для инклюзивного сравнения:

Вы также можете дать Joda-Time , но обратите внимание:

Joda-Time — фактическая стандартная библиотека даты и времени для Java до Java SE 8. Теперь пользователям предлагается перейти на java.time ( JSR-310 ).

Back-ports доступны для Java 6 и 7, а также для Android.

Ниже приведены наиболее распространенные способы сравнения дат. Но я предпочитаю сначала

Подход-1: Использование Date.before (), Date.after () и Date.equals ()

Подход-2: Date.compareTo ()

Подход-3: Calender.before (), Calender.after () и Calender.equals ()

ТЛ; др

Или, лучше, если вы добавите в проект проект библиотеки ThreeTen-Extra .

Полуоткрытый подход, где начало включено, а окончание – исключительно .

Плохой выбор формата

Кстати, это плохой выбор формата для текстового представления даты или даты-времени. По возможности придерживайтесь стандартных форматов ISO 8601 . Форматы ISO 8601 недвусмысленны, понятны в культурах людей и легко анализируются машиной.

Для значения только для даты стандартным форматом является YYYY-MM-DD. Обратите внимание, что этот формат имеет преимущество хронологического при сортировке по алфавиту.

LocalDate

Класс LocalDate представляет значение даты только без времени и без часового пояса.

Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Париже Франция – новый день, еще «вчера» в Монреале Квебек .

DateTimeFormatter

Поскольку ваши строки ввода нестандартного формата, мы должны определить шаблон форматирования для соответствия.

Используйте это для синтаксического анализа входных строк.

В работе с датой времени обычно лучше всего определить промежуток времени по принципу Half-Open, где начало включено, в то время как окончание является исключительным . Поэтому мы хотим знать, является ли сегодня то же самое или позже начала, а также до остановки. Более короткий способ сказать «тот же или позже начала» «не раньше начала».

См. «Ответ от gstackoverflow», показывающий список методов сравнения, которые вы можете вызвать.

О java.time

Рамка java.time встроена в Java 8 и более поздние версии . Эти classы вытесняют неприятные старые устаревшие classы времени, такие как java.util.Date , Calendar и SimpleDateFormat .

Проект Joda-Time , теперь в режиме обслуживания , советует перейти на classы java.time .

Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .

Где можно получить classы java.time?

  • Java SE 8 и SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
    • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport .
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
    • См. Раздел Как использовать ThreeTenABP ….

    Проект ThreeTen-Extra расширяет java.time с дополнительными classами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные classы, такие как Interval , YearWeek , YearQuarter и другие .

    ОБНОВЛЕНИЕ: этот раздел «Joda-Time» ниже остается неизменным как история. Проект Joda-Time , теперь в режиме обслуживания , советует перейти на classы java.time .

    Joda времени

    Другие ответы правильны в отношении связанных classов java.util.Date и java.util.Calendar. Но эти classы, как известно, хлопотны. Итак, вот пример кода с использованием библиотеки Joda-Time 2.3.

    Если вам действительно нужна дата без какой-либо временной части и часовой пояс, используйте class LocalDate в Joda-Time. Этот class предоставляет методы сравнения, включая compareTo (используется с Java Comparators ), isBefore , isAfter и isEqual .

    Определите форматтер, описывающий входные строки …

    Используйте formatter для синтаксического анализа строк в объектах LocalDate …

    Поэтому посмотрите, находится ли вторая между двумя другими (исключительно, что означает не равную конечной точке) …

    Работа с промежутками времени

    Если вы работаете с промежутками времени, я предлагаю исследовать в Joda-Time classы: продолжительность , интервал и период . Методы, такие как overlap и contains простые сравнения.

    Для текстовых представлений ознакомьтесь со стандартом ISO 8601:

    • продолжительность
      Формат: PnYnMnDTnHnMnS
      Пример: P3Y6M4DT12H30M5S
      (Означает «три года, шесть месяцев, четыре дня, двенадцать часов, тридцать минут и пять секунд»)
    • интервал
      Формат: начало / конец
      Пример: 2007-03-01T13: 00: 00Z / 2008-05-11T15: 30: 00Z

    Классы Joda-Time могут работать со строками в обоих форматах, как в качестве входных (синтаксический анализ), так и вывода (генерации строк).

    Joda-Time выполняет сравнения с использованием подхода Half-Open, где начало диапазона включено, в то время как окончание является эксклюзивным . Этот подход является разумным для обработки промежутков времени. Найдите StackOverflow для получения дополнительной информации.

    Сравните две даты:

    Обновление для Java 8 и более поздних версий

    • isAfter()
    • isBefore()
    • isEqual()
    • compareTo()

    Эти методы существуют в LocalDate , LocalTime и LocalDateTime .

    Эти classы встроены в Java 8 и более поздние версии. Большая часть функциональных возможностей java.time была перенесена на Java 6 и 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP (см. Как использовать … ).

    Вы можете использовать Date.getTime() который:

    Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 GMT, представленное этим объектом Date.

    Это означает, что вы можете сравнить их так же, как цифры:

    Используйте getTime (), чтобы получить числовое значение даты, а затем сравните с помощью возвращаемых значений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *