Сравнение двух дат с использованием времени Joda

Я хочу сравнить две даты, однако у меня возникают проблемы. 1 Дата создается из java.util.date объект, а другой создается вручную. Следующий код является примером:

Date ds = new Date();
DateTime d = new DateTime(ds);

DateTime e = new DateTime(2012,12,07, 0, 0);
System.out.println(d.isEqual(e));

однако тест получается false. Я предполагаю, что это из-за времени. Как я могу проверить, равны ли эти две даты друг другу (я имею в виду год, месяц, дату)?

9 ответов


System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight()));

или

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay()));

вы должны использовать toLocalDate ():

date1.toLocalDate().isEqual(date2.toLocalDate())

Это избавит от части времени DateTime.

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

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay())

return DateTimeComparator.getDateOnlyInstance().compare(first, second);

Via Как сравнить две даты без указания времени?


Если вы хотите игнорировать компоненты времени (т. е. вы хотите сравнивать только даты), вы можете использовать класс DateMidnight вместо времени даты. Поэтому ваш пример будет выглядеть примерно так:

Date ds = new Date();
DateMidnight d = new DateMidnight(ds);

DateMidnight e = new DateMidnight(2012, 12, 7);
System.out.println(d.isEqual(e));

но будьте осторожны, он будет печатать "true" только сегодня:)

также обратите внимание, что по умолчанию JDK Date и все мгновенные классы Joda-Time (включая DateTime и DateMidnight) построены с использованием часового пояса по умолчанию. Поэтому, если вы создаете одну дату для сравнения в коде, но извлекаете другую из БД, которая, вероятно, хранит даты в UTC, вы можете столкнуться с несоответствиями, предполагая, что вы не находитесь в часовом поясе UTC.


поскольку они являются объектами DateTime, их временные части также учитываются при их сравнении. Попробуйте установить части времени первой даты в 0, например:

d = d.withTime(0, 0, 0, 0);

это статический метод, который работает для меня.

public static boolean isSameDay(DateTime date1, DateTime date2){
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay());
}

я наткнулся на этот вопрос в сравнении с сегодняшним днем. Вот как вы можете сравнить дату с сегодняшним днем:

date1.toLocalDate().isBeforeNow() // works also with isAfterNow

DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2);

obj1 и obj2 могут быть строкой, длинной, датой (java.util)... Подробнее см. http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html


напишите свой собственный метод

public boolean checkEqual(DateTime first,DateTime second){
     if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){
         return true;
  }
 return false;
}