2013-02-18 6 views
5

Предположим, что у меня есть две даты, такие как следующее.Сравнение дат, игнорирующих секунды и миллисекунды момента 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 со вторым минутным полем обновлено. DateTime неизменен, поэтому нет установленных методов. Вместо этого этот метод возвращает новый экземпляр со значением секунды минуты изменен.

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

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

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

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

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

ответ

6

Я думаю, что вы хотите использовать 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.

+0

спасибо. Готово! – Tiny

+0

@ Tiny. Добро пожаловать :) –

8

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

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

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

+0

Я попробую этот подход позже. Спасибо. – Tiny

0
public static String getFromatDateTime(Date date) { 
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); 
    final GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTime(date); 
    //gc.set(Calendar.HOUR_OF_DAY, 0); 
    //gc.set(Calendar.MINUTE, 0); 
    //block ignore second and millisecond 
    gc.set(Calendar.SECOND, 0); 
    gc.set(Calendar.MILLISECOND, 0); 
    String strDate = sdfDate.format(gc.getTime()); 
    return strDate; 
} 
public static void main(String[] args) throws ParseException { 
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); 
    Date now = new Date(); 
    String currentDate = Testing.getFromatDateTime(now); 
    String fullDate = "2015-12-07 14:53:39.30"; 
    String effDateStr = Testing.getFromatDateTime(sdfDate.parse(fullDate)); 

    System.out.println("Currennt Date: " + currentDate); 
    System.out.println("Effective Date: " + effDateStr); 
    System.out.println(currentDate.compareTo(effDateStr)==0); 
} 
Смежные вопросы