2015-01-22 4 views
1

У меня есть этот код, который сравнивает два объекта Date. Они хранят даты в другом формате, но имеют один и тот же день в значении.Различные форматы Объекты даты не равны

public class DateTest { 
    public static void main(String[] args) { 
     compareDate(); 
    } 

    public static void compareDate() { 
     try { 
      DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss 'ICT' yyyy"); 
      Date date = df.parse("Thu Jan 22 03:16:26 ICT 2015"); 
      System.out.println(date.toString()); 

      DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
      Date date2 = df2.parse("2015-01-22 03:16:26.723"); 
      System.out.println(date2.toString()); 

      System.out.println(date.after(date2)); 
      System.out.println(date2.after(date)); 
      System.out.println(date2.equals(date)); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Выход в моей машине дает:

Thu Jan 22 03:16:26 ICT 2015 
Thu Jan 22 03:16:26 ICT 2015 
false 
true 
false 

Это, по-видимому, показывает, что две даты равны, но почему date2.after (дата) возвращает истину?

Извините, если это основная проблема.

+1

миллисекунды Percision – MadProgrammer

+1

Если вы посмотрите на количество миллисекунд, каждая дата приравнивает к 'date' =' 1421856986000' и ​​'date2' =' 1421856986723' есть разница в миллисекундах – MadProgrammer

+1

Почему вы ожидаете ' 03: 16: 26.723 'НЕ будет позднее' 03: 16: 26'? –

ответ

4

Класс Date может быть немного запутанным, потому что он не представляет собой «дату» (день), а точную метку времени.

Ваш date2 позже, потому что он включает 723 миллисекунды (а другой нет, поэтому их там 000).

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

1

Вы можете посмотреть реализацию java.util.Date.after (Date), которая сравнивает миллисекундную часть двух дат.

/** 
    * Tests if this date is after the specified date. 
    * 
    * @param when a date. 
    * @return <code>true</code> if and only if the instant represented 
    *   by this <tt>Date</tt> object is strictly later than the 
    *   instant represented by <tt>when</tt>; 
    *   <code>false</code> otherwise. 
    * @exception NullPointerException if <code>when</code> is null. 
    */ 
    public boolean after(Date when) { 
     return getMillisOf(this) > getMillisOf(when); 
    } 
Смежные вопросы