Сравнение дат без учета секунд и мгновений миллисекунд DateTime в Joda

Предположим, что у меня есть две даты, подобные следующим.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45");
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45");

Я хочу сравнить эти две даты, чтобы увидеть, является ли firstDate раньше, позже или равно secondDate.

Я мог бы попробовать следующее.

System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isBefore(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isAfter(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.equals(secondDate));

То, что создается этим кодом, именно то, что я хочу.

Он производит следующий вывод.

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = true

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

Мне нужно игнорировать секунды и миллисекунды этих дат. Я пытался использовать методы withSecondOfMinute(0) и withMillis(0), как показано ниже.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillis(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillis(0);        

Но это дало следующий результат.

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = true

Документы метода withSecondOfMinute() описывают.

Возвращает копию этой даты и времени с обновленным полем секунды минуты. DateTime неизменяем, поэтому нет установленных методов. Вместо этого этот метод возвращает новый экземпляр с измененным значением секунды или минуты.

И документы метода withMillis() говорят.

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

Сравнение дат путем полного игнорирования времени можно легко выполнить с помощью DateTimeComparator.getDateOnlyInstance() примерно как показано ниже.

if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)==0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)<0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)>0){}

Как сравнить две даты, игнорируя конкретный момент в DateTime (в данном случае секунды и миллисекунды)?


person Tiny    schedule 18.02.2013    source источник


Ответы (2)


Я думаю, вы хотите использовать DateTime#withMillisOfSecond() вместо DateTime#withMillis() :

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);

Установка для DateTime#withMillis() значения 0, сбросит обе ваши даты на 1/1/1970, и, следовательно, вы получите true за equals вызов на них.

Аналогичным образом, установив для DateTime#withMillisOfDay() значение 0, установит время на midnight.

person Rohit Jain    schedule 18.02.2013
comment
Большое Вам спасибо. Сделанный! - person Tiny; 19.02.2013

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

DateTimeComparator comparator = DateTimeComparator.getInstance(
         DateTimeFieldType.minuteOfHour());

который будет игнорировать вторую и миллисекундную части сравниваемых объектов.

person Steinar    schedule 18.02.2013
comment
Я попробую этот подход позже. Спасибо. - person Tiny; 19.02.2013