Как мне правильно сравнить две даты?

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

В основном я хочу сравнить две даты (более старая дата и новая дата). Я хочу знать, старше ли более старая дата, чем x месяцев и y дней.

int monthDiff = new Date().getMonth() - detail.getCdLastUpdate().getMonth();
int dayDiff = new Date().getDay() - detail.getCdLastUpdate().getMonth();
System.out.println("\tthe last update date and new date month diff is --> " + monthDiff);
System.out.println("\tthe last update date and new date day diff is --> " + dayDiff);

Если более старая дата 2012-09-21 00:00:00.0, в настоящее время она будет возвращать отрицательные числа. Мне нужно выяснить, является ли старая дата ТОЧНО 6 месяцами и 4 днями до новой даты(). Я думаю об использовании абсолютных значений обоих, но сегодня просто не могу думать.

Редактировать: я знаю о joda, но я не могу его использовать. Я должен использовать Java JDK. Редактировать 2: я попробую перечисленные методы, если все не удастся, я буду использовать Joda.


person iCodeLikeImDrunk    schedule 17.04.2013    source источник
comment
Вы обязательно должны сравнить абсолютные даты.   -  person NeplatnyUdaj    schedule 17.04.2013
comment
@user2266098 user2266098 с месяцем, я думаю, можно использовать abs(), но как насчет дня, в разных месяцах разное количество дней :(   -  person iCodeLikeImDrunk    schedule 17.04.2013
comment
Если старая дата — 21-е, а сегодня — 17-е, вы вычисляете 17 минус 21. Как вы ожидаете, что это будет положительным?   -  person jarnbjo    schedule 17.04.2013
comment
Я думал, вам нужна разница двух дат в месяцах и днях. Взгляните на JodaTime: joda-time.sourceforge.net/faq.html#datediff< /а>   -  person NeplatnyUdaj    schedule 17.04.2013


Ответы (3)


даты JDK имеют методы до и после, возвращая boolean, для выполнения вашей задачи:

Date now = new Date();
Calendar compareTo = Calendar.getInstance();
compareTo.add(Calendar.MONTH, -6);
compareTo.add(Calendar.DATE, -4);
if (compareTo.getTime().before(now)) {
   // after
} else {
   // before or equal 
}
person hd1    schedule 17.04.2013
comment
эти функции я знаю, проблема в том, что мне НУЖНО знать, является ли более старая дата 6 месяцев + 4 дня назад (точно) ... - person iCodeLikeImDrunk; 17.04.2013
comment
@JoeChen, тогда укажите это в своем вопросе, пожалуйста. - person Etienne Miret; 17.04.2013
comment
Я изменил свой ответ, чтобы отразить комментарий г-на Чена. - person hd1; 17.04.2013
comment
@hd1 странно, Calendar.DAY не существует!? - person iCodeLikeImDrunk; 17.04.2013
comment
Я бы лично использовал joda для этого, но это должна быть DATE, будет обновлено - person hd1; 17.04.2013
comment
@JoeChen Это потому, что для Calendar.get() и Calendar.set() используются одни и те же константы, поэтому вместо просто DAY у вас есть DAY_OF_MONTH, DAY_OF_YEAR и DAY_OF_WEEK. Все они имеют одинаковое значение, если они заданы для add() (и DATE является псевдонимом для DAY_OF_MONTH). - person Etienne Miret; 17.04.2013
comment
Если вы хотите сравнивать только даты, вы должны установить поля часа дня, минуты, секунды и миллисекунды равными нулю. - person jarnbjo; 17.04.2013

Лучший способ, который я могу придумать, это использовать библиотеку Joda-Time. Пример с их сайта:

Days d = Days.daysBetween(startDate, endDate);
int days = d.getDays();

Или количество месяцев:

Months m = Months.monthsBetween(startDate, endDate)
int months = m.getMonths();

куда:

DateTime startDate =  new DateTime(/*jdk Date*/);
DateTime endDate =  new DateTime(/*jdk Date*/);
person rarry    schedule 17.04.2013
comment
Я бы сам использовал joda, но OP, похоже, хочет классы JDK Date. - person hd1; 17.04.2013
comment
@ hd1 Я не вижу в вопросе доказательств того, что ОП вообще знает о jodatime. - person Sean Patrick Floyd; 17.04.2013

Вздох, я должен добавить неизбежный ответ «использовать JodaTime».

JodaTime предоставляет определенные типы данных для всех значительных временных интервалов.

Date yourReferenceDate = // get date from somewhere
int months = Months.monthsBetween(
                       new DateTime(yourReferenceDate),
                       DateTime.now()
             ).getMonths();
person Sean Patrick Floyd    schedule 17.04.2013