Перейти к содержимому

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

  • автор:

Java. Сравнить даты без учета секунд и миллисекунд

Author24 — интернет-сервис помощи студентам

У меня есть две даты date1 и date2 формата yyyy-MM-dd HH:mm:ss.SSS.
Надо сравнить эти две даты без учета секунд и миллисекунд.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Сравнить строки без учета регистра
У нас есть две строки — one и two. one = Привет; two = приВет; Как сделать так, чтобы эти.

Сравнить 2 символа без учёта регистра
Привет всем. У меня есть два символа: char c=’i’,c2=’I’ И как мне сравнить их без учёта регистра?

Сравнить строки на равенство без учета регистра
Создать две программы. Задание: Вводится две строки. Сравнить строки на равенство без учета.

Прописать даты и месяцы без учёта года
Здравствуйте! Помогите с решением,описание задачи в файле пример.

3553 / 2156 / 568
Регистрация: 02.09.2015
Сообщений: 5,441

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
jshell> var format = "yyyy-MM-dd HH:mm:ss.SSS" format ==> "yyyy-MM-dd HH:mm:ss.SSS" jshell> var formatter = java.time.format.DateTimeFormatter.ofPattern(format) formatter ==> Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOf . Fraction(NanoOfSecond,3,3) jshell> var date1 = java.time.LocalDateTime.parse("2020-11-30 15:10:00.000", formatter) date1 ==> 2020-11-30T15:10 jshell> var date2 = java.time.LocalDateTime.parse("2020-11-30 15:10:22.222", formatter) date2 ==> 2020-11-30T15:10:22.222 jshell> Functionjava.time.LocalDateTime, java.time.LocalDateTime> filter = (java.time.LocalDateTime date) -> date.withSecond(0).withNano(0) filter ==> $Lambda$31/0x0000000800bc0840@78e03bb5 jshell> var result = filter.apply(date1).equals(filter.apply(date2)) result ==> true jshell> System.out.println(result) true

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Выбор даты без учета выходных дней
Коллеги, доброго дня. Помогите допилить скрипт по выбору даты из таблицы. В наличие есть объект.

Сравнить ответ из edit с определенной ячейкой TBGrid без учета регистра
Как сделать так чтобы пользователь вводил в edit ответ, а он сравнивался с определенной ячейкой.

Необходимо сравнить строки между собой без учёта регистра символов
Даны две строки. Необходимо сравнить строки между собой без учёта регистра символов. Программа.

Вывод даты в ListView без часов,минут,секунд
В listView1 выводит дату полностью с часами, минутами, секундами, а необходимо только день, месяц.

Как получить время суток без учёта календарной даты
Всем здравствуйте. Есть проблема, связанная с использованием 16-разрядной функции time из.

Скопировать X любых файлов, созданных между 9:00 и 17:00 (без учёта даты)
Добрый день. Извиняюсь если не там задаю вопрос. Камера делает снимки круглосуточно в течении.

Или воспользуйтесь поиском по форуму:

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

Сравнивать даты можно с помощью методов isAfter() и isBefore() :

import java.time.LocalDateTime; public class App  public static void main(String[] args)  LocalDateTime date1 = LocalDateTime.now(); LocalDateTime date2 = LocalDateTime.now().plusDays(3); System.out.println(date1.isAfter(date2)); // => false System.out.println(date1.isBefore(date2)); // => true > > 

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

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

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

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

 LocalDate firstDate = LocalDate.of(2019, 8, 10);   LocalDate secondDate = LocalDate.of(2019, 7, 1); 

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

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

 assertThat(firstDate.isAfter(secondDate), is(true)); 

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

 assertThat(firstDate.isBefore(secondDate), is(false)); 

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

 assertThat(firstDate.isEqual(firstDate), is(true));   assertThat(firstDate.isEqual(secondDate), is(false)); 

2.1. Сравнение дат с помощью интерфейса Comparable ​

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

 assertThat(firstDate.equals(secondDate), is(false)); 

Вместо этого можно использовать метод isEqual() для сравнения с объектами другого типа, такими как JapaneseDate , ThaiBuddhistDate и т . д.

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

 assertThat(firstDate.compareTo(secondDate), is(1));   assertThat(secondDate.compareTo(firstDate), is(-1)); 

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

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

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

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

 ZonedDateTime timeInNewYork =   ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 0, ZoneId.of("America/New_York"));   ZonedDateTime timeInBerlin =   ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0, ZoneId.of("Europe/Berlin"));    assertThat(timeInNewYork.isAfter(timeInBerlin), is(false));   assertThat(timeInNewYork.isBefore(timeInBerlin), is(false));   assertThat(timeInNewYork.isEqual(timeInBerlin), is(true)); 

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

 assertThat(timeInNewYork.equals(timeInBerlin), is(false));   assertThat(timeInNewYork.compareTo(timeInBerlin), is(-1)); 

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

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

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

 public static boolean isSameDay(LocalDateTime timestamp,   LocalDate localDateToCompare)    return timestamp.toLocalDate().isEqual(localDateToCompare);   > 

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

 public static boolean isSameDay(LocalDateTime timestamp,   LocalDateTime timestampToCompare)    return timestamp.truncatedTo(DAYS)   .isEqual(timestampToCompare.truncatedTo(DAYS));   > 

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

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

 public static boolean isSameHour(LocalDateTime timestamp,   LocalDateTime timestampToCompare)    return timestamp.truncatedTo(HOURS)   .isEqual(timestampToCompare.truncatedTo(HOURS));   > 

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

 public static boolean isSameHour(ZonedDateTime zonedTimestamp,   ZonedDateTime zonedTimestampToCompare)    return zonedTimestamp.truncatedTo(HOURS)   .isEqual(zonedTimestampToCompare.truncatedTo(HOURS));   > 

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

 ZonedDateTime zonedTimestamp =   ZonedDateTime.of(2019, 8, 10, 8, 30, 0, 0, ZoneId.of("America/New_York"));   ZonedDateTime zonedTimestampToCompare =   ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0, ZoneId.of("Europe/Berlin"));    assertThat(DateTimeComparisonUtils.   isSameHour(zonedTimestamp, zonedTimestampToCompare), is(true)); 

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

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

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

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

 Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 0, 00, 00));   Date secondDate = toDate(LocalDateTime.of(2019, 8, 15, 0, 00, 00));    assertThat(firstDate.after(secondDate), is(false));   assertThat(firstDate.before(secondDate), is(true));   assertThat(firstDate.compareTo(secondDate), is(-1));   assertThat(firstDate.equals(secondDate), is(false)); 

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

 public static boolean isSameDay(Date date, Date dateToCompare)    return DateUtils.isSameDay(date, dateToCompare);   >    public static boolean isSameHour(Date date, Date dateToCompare)    return DateUtils.truncatedEquals(date, dateToCompare, Calendar.HOUR);   > 

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

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

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

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

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

  • 1. Введение
  • 2. Сравнение дат
    • 2.1. Сравнение дат с помощью интерфейса Comparable

    В Java массив дат без года (день и месяц только) и сравнение даты с датами в массиве?

    Как сделать массив дат без года (день и месяц только) и потом сравнить дату, введенную пользователем с одной из дат в массиве?

    пишу, но до конца применение понять не могу.
    Может есть проще способ?

    • Вопрос задан 07 апр. 2023
    • 160 просмотров

    5 комментариев

    Простой 5 комментариев

    leahch

    Код в студию и только то, что не получается. И да java.time.
    Сергей Горностаев @sergey-gornostaev Куратор тега Java
    Зачем это нужно? В зависимости от задачи правильное решение будет разным.
    KUBud @KUBud Автор вопроса
    Сергей Горностаев, нужно для определения знака зодиака по дате введенной пользователем
    KUBud @KUBud Автор вопроса

    System.out.println("Привет! Введи свою дату рождения!"); LocalDateTime local = LocalDateTime.parse("1987-03-07"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/YYYY"); Month month = local.getMonth(); System.out.println(clientBirthDay.getMonth()); System.out.println(clientBirthDay.getDayOfMonth()); if (clientBirthDay.getMonth() == Month.APRIL && Month.MARCH) < System.out.println("ДА! ПОЛУЧИЛОСЬ!"); >else< System.out.println("F**K"); int[] clientBday = ;

    leahch

    KUBud, А чего не получается-то? Код вроде бы правильный.
    Решения вопроса 0
    Ответы на вопрос 2

    leahch

    Я мастер на все руки, я козлик Элек Мэк 🙂
    Извиняюсь, было лень java запускать, вызвал из REPL clojure, используя явовские классы

    (def sdf (java.text.SimpleDateFormat. "yyyy-MM") (.format sdf (java.util.Date.)) ;; => "2023-04" (.parse sdf "2022-01") ;; => #inst "2021-12-31T21:00:00.000-00:00"

    Это примерно вот это на яве

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); Date dn = new Date(); System.out.println(sdf.format(dn)); Date dp = sdf.parse("2022-01"); System.out.println(dp);

    Ну и фильтрануть по по массиву строк с датами

    ;; собственно сам массив со строками дат (def dates (map (fn [i] (str "2022-" i)) (range 1 10))) ;; dates ;; => ("2022-1" ;; "2022-2" ;; "2022-3" ;; "2022-4" ;; "2022-5" ;; "2022-6" ;; "2022-7" ;; "2022-8" ;; "2022-9") ;; Функция фильтрации, в яве можно использовать Stream API (defn filter-dates [dates chk] (filter (fn [x] (some (partial = x) chk)) dates) ) ;; фильтруем :) (filter-dates dates ["2022-1" "2022-9" "2023-1"] ) ;; => ("2022-1" "2022-9")

    Ответ написан 07 апр. 2023
    Комментировать
    Нравится 1 Комментировать

    Самый простой способ сравнивать даты как строки, используя метод compareTo
    Если у вас имеется массив LinkedList listDates в виде строковых чисел, например: 01.01.2023 или 01-01-2023 и т.п., то его можно отсортировать или найти нужную дату следующим образом:

    String tmp; for(int i = listDates.size()-1; i >=0 ; i--)< for(int j = 0; j < i; j++)< if(listDates.get(j).compareTo(listDates.get(j+1))>0) < tmp = listDates.get(j); listDates.set(j, listDates.get(j+1)); listDates.set(j+1, tmp); >> >

    Ответ написан 09 апр. 2023
    Комментировать
    Нравится 1 Комментировать
    Ваш ответ на вопрос

    Войдите, чтобы написать ответ

    java

    • Java
    • +1 ещё

    Как интегрировать Java в 1C?

    • 2 подписчика
    • 6 часов назад
    • 144 просмотра

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

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