Мне нужно сравнить два Date
s (например, date1
и date2
) и придумать a, boolean sameDay
которое верно для этих двух Date
акций в один и тот же день, и false, если это не так.
Как я могу это сделать? Здесь, кажется, вихрь путаницы ... и я бы хотел, если это вообще возможно, избежать других зависимостей за пределами JDK.
уточнить: если date1
и date2
поделить один и тот же год, месяц и день, то sameDay
верно, в противном случае это неверно. Я понимаю, что для этого требуется знание часового пояса ... было бы неплохо перейти в часовой пояс, но я могу жить либо по Гринвичу, либо по местному времени, пока я знаю, каково это поведение.
еще раз уточнить:
date1 = 2008 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = true
date1 = 2009 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = false
date1 = 2008 Aug 03 12:00:00
date2 = 2008 Jun 03 12:00:00
=> sameDate = false
Ответы:
Обратите внимание, что «тот же день» не так проста, как звучит, когда могут быть задействованы разные часовые пояса. Приведенный выше код для обеих дат вычисляет день относительно часового пояса, используемого компьютером, на котором он работает. Если это не то, что вам нужно, вы должны передать соответствующий часовой пояс (ы) на
Calendar.getInstance()
вызовы, после того как вы решили, что именно вы имеете в виду под «в тот же день».И да, Joda Time
LocalDate
сделает все это намного чище и проще (хотя будут присутствовать те же трудности с часовыми поясами).источник
Как насчет:
При необходимости вы также можете установить часовой пояс на SimpleDateFormat.
источник
SimpleDateFormat
метод на самом деле быстрее, чем другой, упомянутый здесь с использованиемCalendar
s. В среднемCalendar
метод занимает половину времени . (По крайней мере, в моей системе). Престижность!Для этого я использую пакет «apache commons lang» (а именно org.apache.commons.lang.time.DateUtils )
источник
Вы можете избежать внешних зависимостей и снижения производительности при использовании Календаря, рассчитав число дней Юлиана для каждой из дат, а затем сравнив их:
источник
Date
s не инкапсулируют понятие часовых поясов, поэтому нет способа произвольно это исправить.Joda времени
Что касается добавления зависимости, я боюсь, что java.util.Date & .Calendar действительно настолько плохи, что первое, что я делаю в любом новом проекте, это добавляю библиотеку Joda-Time. В Java 8 вы можете использовать новый пакет java.time, вдохновленный Joda-Time.
Ядро Joda-Time - это
DateTime
класс. В отличие от java.util.Date, он понимает свой назначенный часовой пояс (DateTimeZone
). При конвертации из juDate назначьте зону.LocalDate
Один из способов проверить, попадают ли две даты-даты в одну и ту же дату, - преобразовать в
LocalDate
объекты.Это преобразование зависит от назначенного часового пояса. Чтобы сравнить
LocalDate
объекты, они должны быть преобразованы в одной зоне.Вот небольшой вспомогательный метод.
Лучше будет другой аргумент, указывающий часовой пояс, а не предполагающий, что следует использовать часовой пояс первого объекта DateTime.
Строковое Представление
Другой подход состоит в том, чтобы создать строковое представление части даты каждой даты-времени, а затем сравнить строки.
Опять же, назначенный часовой пояс имеет решающее значение.
Промежуток времени
Обобщенное решение состоит в том, чтобы определить интервал времени, а затем спросить, содержит ли интервал вашу цель. Этот пример кода в Joda-Time 2.4. Обратите внимание, что относящиеся к «полуночи» классы устарели. Вместо этого используйте
withTimeAtStartOfDay
метод. Joda-Time предлагает три класса для представления промежутка времени различными способами: Интервал, Период и Продолжительность.Использование подхода «полуоткрытого», когда начало диапазона включено, а окончание - эксклюзивно.
Часовой пояс цели может отличаться от часового пояса интервала.
java.time
Java 8 и более поздние версии поставляются с фреймворком java.time . Вдохновленный Joda-Time, определенным JSR 310 и расширенным проектом ThreeTen-Extra. Смотрите учебник .
Создатели Joda-Time поручили нам всем перейти на java.time, как только это будет удобно. Тем временем Joda-Time продолжает активно поддерживать проект. Но ожидайте, что будущая работа будет происходить только в java.time и ThreeTen-Extra, а не в Joda-Time.
Подводя итог java.time в двух словах ... Это
Instant
момент времени на UTC. Примените часовой пояс (ZoneId
), чтобы получитьZonedDateTime
объект. Для перехода от временной шкалы, чтобы получить смутное неопределенное представление о дате-времени, использовать «локальные» классов:LocalDateTime
,LocalDate
,LocalTime
.Логика, обсуждаемая в разделе Joda-Time этого Ответа, применима к java.time.
Старый класс java.util.Date имеет новый
toInstant
метод для преобразования в java.time.Для определения даты требуется часовой пояс.
Мы применяем этот объект часового пояса к,
Instant
чтобы получитьZonedDateTime
. Из этого мы извлекаем значение только для даты (aLocalDate
), поскольку наша цель - сравнить даты (не часы, минуты и т. Д.).Сделайте то же самое со вторым
java.util.Date
объектом, который нам нужен для сравнения. Я просто использую текущий момент вместо этого.Используйте специальный
isEqual
метод для проверки того же значения даты.источник
LocalDate localDate = LocalDate.fromDateFields(yourJavaUtilDate);
fromDateFields()
в моемLocalDate
классе .Конвертировать даты в Java 8 java.time.LocalDate, как показано здесь .
источник
ZoneId.of("America/Phoenix")
илиZoneId.of("Europe/Budapest")
вместо системного значения по умолчанию.Java 8
Если вы используете Java 8 в своем проекте и сравниваете
java.sql.Timestamp
, вы можете использоватьLocalDate
класс:Если вы используете
java.util.Date
, посмотрите на ответ Иштвана, который является менее двусмысленным.источник
date1
иdate2
естьjava.sql.Timestamp
? По вопросу ониDate
, я бы понялjava.util.Date
. Кроме того, ваш код использует настройку часового пояса компьютера, что для многих целей будет хорошо; все же я предпочел бы сделать этот факт явным в коде.java.sql.Timestamp
. Как вы сказали, обычно лучше явно установить часовой пояс.источник
ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ANDROID:
Вы можете использовать,
DateUtils.isToday(dateMilliseconds)
чтобы проверить, является ли данная дата текущим днем или нет.Справочник по API: https://developer.android.com/reference/android/text/format/DateUtils.html#isToday(long)
источник
DateUtils.isToday(x.getTime())
(x является экземпляром java.util.date)в дополнение к решению Бинил Томас
использование
источник
Для разработчиков Kotlin это версия со сравнением форматированных строк:
Это не лучший способ, но он короткий и работает.
источник
SimpleDateFormat
Класс был вытеснен лет назад современногоjava.time.DateTimeFormatter
класса , определенного в JSR 310. Советовать его использование в 2019 году плохой совет.вы можете применять ту же логику, что и решение SimpleDateFormat, не полагаясь на SimpleDateFormat
источник