Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Как сравнивать даты на Java
Введение Даты — это то, с чем мы сталкиваемся в повседневной жизни, независимо от того, используются ли они для календарей, планирования встреч или даже для запоминания дней рождения. Естественно, при работе с датами нам часто нужно знать, наступает ли определенная дата до или после другой, или они представляют одну и ту же календарную дату. В этой статье мы рассмотрим, как сравнить две даты в Java. * Сравнение дат * Использование Date.compareTo () * Использование Date.before (), Date.after () и Date.equals () *
Время чтения: 7 мин.
Вступление
Даты — это то, с чем мы сталкиваемся в повседневной жизни, независимо от того, используются ли они для календарей, планирования встреч или даже для запоминания дней рождения. Естественно, при работе с датами нам часто нужно знать, наступает ли определенная дата до или после другой, или они представляют одну и ту же календарную дату.
В этой статье мы рассмотрим, как сравнить две даты в Java .
- Использование Date.before() , Date.after() и Date.equals()
- Использование LocalDate.isAfter() , LocalDate.isBefore() , LocalDate.isEqual()
- Использование LocalDate.compareTo() и LocalDate.equals()
Сравнение дат
Класс java.util.Date представляет конкретный момент времени с точностью до миллисекунды.
Он также имеет несколько встроенных методов, которые позволяют нам сравнивать каждый Date с другими экземплярами Date
- Date.compareTo(Date date)
- Date.equals(Object obj)
- Date.before(Date when)
- Date.after(Date when)
Примечание. Обратите внимание, что у Date есть несколько устаревших методов, включая обычный конструктор. Это старый класс, замененный новым API даты / времени в Java 8, который рассматривается сразу после этого раздела. Если вы используете Java 8+ , обратитесь к разделам после этого .
Если вы используете версию до Java 8 , обратитесь к разделу Joda-Time .
Использование Date.compareTo ()
Как обычно с compareTo() реализованными из Comparable , этот метод принимает другой Date и сравнивает его со значением вызывающей Date , возвращая 0 если значения равны , значение меньше 0 если дата вызова предшествует дате аргумент и значение больше 0 если дата вызова находится после аргумента.
В противном случае он NullPointerException , если аргумент равен null .
Давайте создадим два Date и сравним их:
Выполнение этого кода приводит к:
Примечание. Опять же, это работает только для версий Java до Java 8 . С тех пор конструктор Date(int year, int month, int day) устарел, и остается только Date(long date) .
Использование Date.before () , Date.after () и Date.equals ()
Метод after() проверяет, находится ли вызывающая Date после Date аргумента, возвращая значения true или false соответственно. before() делает то же самое, проверяя, находится ли вызывающая Date перед аргументом Date .
Метод equals() сравнивает две Dates предмет равенства и возвращает true тогда и только тогда, когда аргумент не равен null и является Date который представляет тот же момент времени, что и вызывающий объект, иначе он вернет false . Другими словами, он проверяет, указывают ли ссылки на один и тот же объект в памяти.
Все три NullPointerException если аргумент равен null . Теперь мы можем сделать предыдущий фрагмент кода более удобным и читаемым, если мы заменим целочисленные проверки следующими методами:
Если вы не знакомы с SimpleDateFormat , вы можете прочитать наше Руководство по форматированию дат в Java с помощью SimpleDateFormat.
Выполнение этого кода приводит к:
Сравнение LocalDates
Начиная с Java 8 , у нас были большие изменения относительно даты и времени. С существующим API даты и времени было много проблем, таких как отсутствие потоковобезопасных классов и методов, отсутствие логики часовых поясов и общий дизайн API, который было непросто понять.
Руководствуясь этими проблемами, автор Joda-Time (популярный заменитель тусклого API до Java 8) и Oracle представили нам новый API даты / времени через java.time .
LocalDate является одним из наиболее часто используемых классов java.time наряду с LocalTime и LocalDateTime . Он представляет дату без полей времени или часового пояса с форматом даты по умолчанию yyyy-mm-dd .
Встроенные методы сравнения очень похожи на класс Date
- LocalDate.isAfter()
- LocalDate.isBefore()
- LocalDate.isEqual()
- LocalDate.compareTo()
- LocalDate.equals()
Использование LocalDate.isAfter () , LocalDate.isBefore () и LocalDate.isEqual ()
Все три метода проверяют, находится ли вызванный LocalDate до, после или равный аргументу, возвращая boolean значения соответственно.
LocalDate два экземпляра LocalDate, используя вспомогательный метод of() и передав значения year , month и day :
Использование LocalDate.compareTo () и LocalDate.equals ()
Опять же, как обычно, compareTo() сравнивает экземпляры и возвращает -1 , 0 или 1 зависимости от значений LocalDate s. С другой стороны, метод equals() проверяет, указывают ли ссылки на один и тот же объект в памяти:
Поскольку мы создали два LocalDate с одинаковыми значениями, без использования ключевого слова new new Object , это один и тот же LocalDate :
Фактически, поскольку LocalDate не имеет общедоступного конструктора , мы не можем вызывать для него new .
Сравнение календарей
Класс java.util.Calendar является частью старого API даты и времени и в основном используется для преобразования между моментами и полями календаря, такими как DAY_OF_MONTH и т. Д.
Они также могут содержать данные, связанные с датой, и, конечно же, их можно сравнивать:
Сравнение с Joda-Time
Joda-Time была стандартизированной сторонней библиотекой даты / времени для Java до Java 8. Она решала проблемы, присутствующие в исходном API, которых было много. Это также послужило вдохновением и отправной точкой для капитального ремонта всего API, в результате чего появился текущий пакет java.time
С Joda-Time мы можем использовать до восьми различных календарных систем, управлять часовыми поясами или даже определять свои собственные календари. Но что еще более важно, нам не нужно беспокоиться об изменчивости .
Вместо того, чтобы представлять даты как экземпляры во времени, Joda-Time представляет их как фактические даты. Для того, чтобы показать , как мы сравним даты , используя Joda-Time, мы будем использовать LocalDate класс (класс Joda-Time) , который является потокобезопасным.
Использование DateTimeComparator
Класс DateTimeComparator специально создан для сравнения дат. Он работает с ReadableInstant s, String s, Date s, Calendar s и Long s. Итак, нам нужно преобразовать наши Joda-Time LocalDate s в Date s:
Этот метод возвращает целочисленный результат, как и метод compareTo() , где -1 означает, что первая дата предшествует второй, 0 означает, что они такие же, а 1 означает, что первый объект находится после второго:
Использование LocalDate.isEqual ()
Аналогично текущему API даты / времени мы можем использовать isEqual() :
В результате получается boolean :
Использование LocalDate.isBefore () и LocalDate.isAfter ()
Опять же, как и в случае с API Java 8, мы можем использовать isBefore() и isAfter() для сравнения двух LocalDate :
Использование LocalDate.compareTo ()
Расширение Comparable , то LocalDate класс имеет compareTo() метод, который возвращает целое число больше, меньше или равное нулю. Поля сравниваются с тем и первым полем , который не является равным используются для определения результата:
Использование LocalDate.equals ()
И, наконец, метод equals() проверяет равенство ссылок на объект:
Заключение
В этой статье мы рассмотрели несколько способов сравнения дат в Java. Мы использовали устаревший java.util.Date для старых проектов и класс java.util.Calendar
Затем мы перешли к более современному API даты и времени Java 8 и, наконец, к Joda-Time.
Как в Excel сравнить 2 даты между собой — простая инструкция
Нередко пользователю Excel необходимо сравнить две даты друг с другом.Такая задача может появляться в самых разных отраслях. Например, бухгалтеру необходимо вычислять количество месяцев, кварталов или лет, которые прошли между разными датами. Полезно вычислять разницу между датами и в обычной жизни. Например, многие люди планируют личные дела в Excel, ставят цели и ведут бюджет, и данная функция позволяет им лучше планировать долгосрочные отрезки времени.
Эта задача сперва может несколько сбить с толку, поскольку даты нельзя на первый взгляд сравнить между собой, как числа. Но на самом деле, это именно так и делается. Причина в том, что Excel каждую дату записывает в числовом формате. Следовательно, сравнивая даты, по сути программа сравнивает между собой два числа. И здесь возможно несколько вариантов, которые мы рассмотрим более подробно.
2 популярных способа сравнения 2 дат в Excel
Итак, если нам требуется сравнить две даты между собой, это можно сделать двумя основными методами в зависимости от поставленной задачи. Давайте узнаем, какие они. В этом нет ничего сложного, формулы довольно простые и почти не отличаются от тех, которые применяются для работы с числами. Не забываем о том, что дата воспринимается электронной таблицей, как число, и обрабатывается аналогичным образом.
Первая дата больше второй, или нет
В этом случае нужно использовать аналогичную формулу, которая используется для проверки чисел: =A1>A2. Если эта проверка подтверждается, то в ячейку, куда была записана эта формула, возвращается значение “ИСТИНА”. Если же первое число меньше второго, то тогда будет записано “ЛОЖЬ”. Аналогично, только зеркально противоположно с формулой =A1<A2. Если в результате проверки оказывается, что первое значение оказалось меньше второго, то в ячейку будет возвращено логическое значение «ИСТИНА». Если же больше – «ЛОЖЬ».
Функция ЕСЛИ, значение ИСТИНА или ЛОЖЬ
Это уже более сложный вариант, который дает возможность не только говорить, действительно ли одна дата больше другой, но и указывать, на какое количество дней. Чтобы это сделать, необходимо нажать по ячейке и записать туда формулу =ЕСЛИ(A2>B2;»Первая дата больше второй на»&» «&A2-B2&» «&»дней»;»Первая дата меньше второй на»&» «&B2-A2&» «&»дней»)
1
Здесь мы осуществляем проверку двух дат, и исходя из того, что у нас получилось в итоге, выводим результат, на сколько дней первая дата больше, чем вторая. Чтобы это сделать, нами был использовал оператор &, который объединяет две строки текста между собой и объединенный результат возвращает в ячейку. Далее получившийся текст можно использовать сам по себе или в других формулах.
Функция РАЗНДАТ — разность двух дат в днях, месяцах и годах
Предположим, вы работаете в пенсионном фонде и хотите определить трудовой стаж в количестве лет, дней, месяцев и так далее. Это можно сделать с помощью функции РАЗНДАТ .
Ее синтаксис элементарный.
РАЗНДАТ(начальная_дата; конечная_дата; способ_измерения)
Единственный из этих аргументов, который действительно может вызвать вопросы у неподготовленного читателя – это способ измерения. С его помощью мы задаем, в каких единицах будет измеряться разница между датами. Это может быть количество месяцев, лет или количество месяцев без учета лет. Еще один вариант – это количество дней без учета месяцев и лет.
Важно учесть, что в некоторых случаях эта функция может вернуть неправильное значение. Это бывает, когда день первой даты больше, чем день второй. Такая ситуация может быть, например, когда нужно рассчитать количество дней между двумя датами, первая из которых происходила в конце месяца, а другая – в начале следующего.
Разница 2 дат в днях
Чтобы определить разницу между двумя датами в днях, необходимо воспользоваться такой формулой.
Но к сожалению, эта формула не работает настолько идеально, как хотелось бы. Давайте приведем небольшой пример для большей наглядности.
Предположим, начальной датой у нас является 23.02.2009, а конечной – 24.02.2009.
В результате формулой будет возвращено значение 1, что равняется количеству дней, которое прошло с момента исходной даты (отсчет начинается с нуля). Именно из-за того, что отсчет в этом случае начинается с нуля, нельзя использовать эту формулу в чистом виде, например, чтобы рассчитать количество дней, которое отработал человек. Ведь очевидно, что если человек начал работать 23 февраля, а 24 числа прекратил работать, то он по факту отработал 2 дня, а не один.
Та же самая история с количеством месяцев. Если начальной датой служит 28 февраля, а конечная – первое марта, и оба числа относятся к 2008 году, то результат будет 2 дня. И это правильно.
Чтобы решить все проблемы с отображением месяцев в Excel, существует специальная формула ЦЕЛОЕ() , которая округляет число в меньшую сторону. Поскольку время является дробной частью целого дня в понимании Excel, то фактически эти часы будут отсечены. То же касается и других элементов даты, числа, месяца, которые представлены, как дробная часть.
Кстати, можно использовать формулу =ЧИСТРАБДНИ() для того, чтобы определить количество рабочих дней между двумя датами.
Разница дат в полных месяцах
Чтобы определить количество полных месяцев, которое прошло с одной даты до другой, необходимо воспользоваться такой же самой формулой, которая была приведена выше, только третий аргумент должен содержать аргумент m.
То есть, формула следующая.
Эта формула также может давать несколько неточные данные. Поэтому всегда нужно перепроверять значения самостоятельно.
Разница в днях без учета лет
Эта формула также может использоваться для определения количества дней между двумя датами, но при этом не учитывать количество лет, которое прошло между этими двумя временными точками. Эта возможность есть, но пользоваться ею настоятельно не рекомендуется, потому что искажений в этом случае может быть еще больше.

1
Эта формула вернет правильный результат только тогда, когда в компьютере показано правильное время. Конечно, в большинстве современных операционных системах дата и время определяется автоматически, но иногда случаются сбои. Поэтому перед тем, как подсчитывать разницу в днях без учета лет, нужно убедиться, что на компьютере установлена правильная дата и время. Особенно если электронная таблица пересылалась другому человеку.
Быстрое выделение различающихся значений
Это очень просто. Если вам необходимо понять, есть ли отличающиеся значения в документе Эксель, вам необходимо найти кнопку «Найти и выделить», расположенную на вкладке «Главная». После этого в диалоговом окне «Выделить группу ячеек» в качестве критерия выбираем «отличия по строкам».
2
3
После этого все отличающиеся значения будут выделены автоматически, и с ними можно осуществлять те действия, которые нужно.
Сравнение 2 дат с помощью условного форматирования
Также можно использовать популярную функцию Excel, которая называется условным форматированием, чтобы осуществить сравнение двух дат между собой. Отличающееся значение будет выделяться определенным цветом. Причем вы решаете, как оно должно быть отформатировано.
Чтобы воспользоваться этой опцией, необходимо перейти на вкладку «Главная», и там найти соответствующую большую кнопку. Появится список, в котором нас интересует пункт «Управление правилами». После того, как мы выберем опцию «Диспетчер правил условного форматирования», нам необходимо создать правило с помощью специальной кнопки, которая располагается там же.
В качестве правила условного форматирования необходимо использовать формулу. После этого записываем формулу (важно, чтобы результат получался истинным), стиль форматирования и нажимаем на кнопку «ОК».
Такое сравнение можно осуществлять с данными любого типа, не только с датами. Скорее, данный метод нужен для того, чтобы выделить данные, которые отличаются, чтобы потом прописать для них функцию. Но можно изначально прописать ту функцию, которая подходит в конкретной ситуации и выделить истинные значения специальным цветом. Здесь уже как душе будет угодно.
Сравнение 2 столбцов на предмет совпадения
Чтобы сравнить между собой два столбца, являются ли они одинаковыми или нет, необходимо воспользоваться условным форматированием. Последовательность действий в целом такая же, как описано выше. Предположим, нам необходимо выполнить такие операции со следующей таблицей.
4
Каждой колонке нужно дать правильное имя сперва. С помощью него нам будет легче понять, какие диапазоны ячеек сравниваются между собой.
Сама последовательность действий следующая:
- Переходим на вкладку «Формулы». Там нужно найти кнопку «Присвоит имя». Она находится в самом верху панели инструментов непосредственно под заголовком самой вкладки.
- Откроется окно, в котором нам нужно задать имя для каждого из диапазонов. Допустим, нам нужно назвать первый диапазон «Таблица 1».
- После этого выбираем диапазон, который нам нужно так назвать. Для этого нажимаем на кнопку, расположенную справа от поля, подписанного как «Диапазон», выделить нужный набор ячеек и нажать на кнопку «ОК».
- Действия со вторым списком аналогичны. Единственное исключение – нужно дать ему другое имя. Ну и естественно, задать правильные адреса этого диапазона.
Рекомендация. Воспользуйтесь полем имен для того, чтобы дать диапазону нужное имя значительно быстрее.
Найти его вовсе несложно. После того, как мы выделим подходящий набор ячеек, слева от строки формул нужно нажать на поле, показанное на скриншоте. После этого вводим имя и нажимаем на кнопку «Ввод».

5
Для сравнения двух колонок нам нужно воспользоваться уже знакомым инструментом «Условное форматирование». Приблизительная последовательность действий будет следующей. Если говорить о конкретных шагах, то они будут сильно зависеть от того, какую конкретную задачу необходимо выполнить пользователю.
- Выделяем нужный диапазон. После этого создаем правило форматирования «Использовать формулу…».
6 - После этого в соответствующем поле вводится сама формула, а также задается формат ячеек, для которых эта формула оказывается истинной.
7 - Далее выбираем заливку. После этого снова выбирается условное форматирование, но уже для другого списка. На этот раз, нужно выбрать другой цвет.
После того, как мы закончим все эти действия, получим приблизительно следующий результат.
8
Нами была применена функция СЧЕТЕСЛИ , которая осуществляет проверку списка на предмет соответствия определенному критерию, после чего выдает значение «ИСТИНА» или «ЛОЖЬ». Если была возвращена «ИСТИНА», то соответствующие ячейки окрашиваются в цвета, заданные пользователем до использования условного форматирования.
Проверка будет осуществляться поочередно. И использоваться эта формула может и во всех других случаях, не только для сравнения двух дат между собой. Например, если есть два прайса, где нужно сравнить цены между собой (определить, какие отличаются, какие больше по сравнению с аналогичными позициями другого прайса), то также можно использовать эту формулу в условном форматировании.
Формула для сравнения 2 дат
Как видим, формула для сравнения 2 дат может быть любой из вышеперечисленных. Пользователь может выбирать, какую из них выбирать. В ряде случаев придется модифицировать их, чтобы адаптировать под конкретные цели. Например, когда перед нами стояла задача определить, сколько дней работник проработал, то к имеющейся формуле нужно добавлять единицу, чтобы отсчет начать не с нуля, а первого дня.
Таких нюансов может быть еще огромное количество. Но все эти тонкости постигаются в процессе работы с электронными таблицами. К сожалению, даже одной большой статьи недостаточно, чтобы раскрыть все аспекты сравнения дат. Тем не менее, это не такая сложная задача, как может показаться на первый взгляд. И мы только что в этом убедились. Успехов.
How can I compare two dates in PHP?
If I wanted to compare today’s date against the date in the database to see which one is greater, how would I do it?
but it doesn’t really work that way. What’s another way of doing it?
![]()
13 Answers 13
If all your dates are posterior to the 1st of January of 1970, you could use something like:
If you are using PHP 5 >= 5.2.0, you could use the DateTime class:
Or something along these lines.
in the database the date looks like this 2011-10-2
Store it in YYYY-MM-DD and then string comparison will work because ‘1’ > ‘0’, etc.
Just to compliment the already given answers, see the following example:
Update: Or simple use old-school date() function:
![]()
I would’nt do this with PHP. A database should know, what day is today.( use MySQL->NOW() for example ), so it will be very easy to compare within the Query and return the result, without any problems depending on the used Date-Types
![]()
![]()
![]()
Here’s a way on how to get the difference between two dates in minutes.
You can convert the dates into UNIX timestamps and compare the difference between them in seconds.
![]()
I had that problem too and I solve it by:
Here’s my spin on how to get the difference in days between two dates with PHP. Note the use of ‘!’ in the format to discard the time part of the dates, thanks to info from DateTime createFromFormat without time.
Found the answer on a blog and it’s as simple as:
And you’ll get the days between the 2 dates.
![]()
This works because of PHP’s string comparison logic. Simply you can check.
Both dates must be in the same format. Digits need to be zero-padded to the left and ordered from most significant to least significant. Y-m-d and Y-m-d H:i:s satisfy these conditions.
If you want a date ($date) to get expired in some interval for example a token expiration date when performing a password reset, here’s how you can do:
But in your case you could do the comparison just as the following:
![]()
first of all, try to give the format you want to the current date time of your server:
Obtain current date time
Separate date and time to manage them as you wish:
$current_date_only = $current_date[year].’-‘.$current_date[mon].’-‘.$current_date[mday]; $current_time_only = $current_date[‘hours’].’:’.$current_date[‘minutes’].’:’.$current_date[‘seconds’];