Я вытаскиваю даты из базы данных Oracle. Они установлены на java.util. Поле даты и они в действительности java.sql. Экземпляры метки времени (который является подклассом Java.util. Дата). Если я сравниваю две из этих меток времени от двух различных записей базы данных путем вызова после () на первом свидании и сравниваю его со вторым, я получаю неправильный ответ, когда все части даты являются тем же за исключением миллисекунд.
Все следующее должно привести к "истинному", однако второй набор чисел не делает:
firstDate = 1/1/2000 12:00:20:00
secondDate = 1/1/2000 12:00:10:00
result = firstDate.after(secondDate);
result is TRUE <-- EXPECTED RESULT
firstDate = 1/1/2000 12:00:00:10
secondDate = 1/1/2000 12:00:00:00
result = firstDate.after(secondDate);
result is FALSE <-- NOT EXPECTED, result should be TRUE
Я знаю, что nanos хранятся отдельно от экземпляра Даты в классе Метки времени, и мне любопытно, если это - проблема.
Вы можете сравнить их, но только сравнивая миллисекунды. Хотя это довольно уродливо, похоже, что он работает во всех случаях (независимо от того, java.sql.Timestamp
или java.util.Date
).
if(date1.getTime() > date2.getTime()) {
//...
}
Без фактического кода это предположение, но я думаю, что один из ваших объектов - java.util.Date
, а другой - java.sql.Timestamp
, вы не можете сравнивать их, поскольку поле миллис
в «Timestamp» усекается до секунды, а остаток сохраняется в поле нано
. Очень жаль, что Timestamp
является подклассом Date
. Это определенно приводит к проблеме, с которой вы столкнулись.
РЕДАКТИРОВАТЬ.
Еще одна возможность - драйвер БД возвращает собственный подкласс Timestamp
. Поскольку класс не является окончательным, вполне возможно, что их реализация испортила compare
Timestamp, хотя это не особо сложно сделать.
Похоже, что проблема в том, что firstDate и secondDate установлены в объекты Java.util.Date, но в JavaDoc для java.sql.Timestamp упоминается, что это композит из java.util.Date и отдельного значения nanoseconds.
Вот почему он возвращает false, когда вы пытаетесь сравнить эти два значения. Если вы измените firstDate и secondDate на реальные объекты Timestamp, они должны работать.
Ключ к проблеме здесь - когда метки времени приводятся к объектам Date. Метод after для Date используется вместо метода after в Timestamp. Если не привести к Date, метод отметки времени after будет работать правильно.
Думаю, сейчас мне нужен урок по параметрам ковариантного метода , почему метод после в Timestamp не вызывается в следующем коде.
java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L);
java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L);
java.util.Date oneDate = (java.util.Date) one;
java.util.Date twoDate = (java.util.Date) two;
System.out.println("one: " + oneDate.getTime());
System.out.println("two: " + twoDate.getTime());
if (oneDate.after(twoDate)) {
System.out.println(oneDate.getTime() + " after " + twoDate.getTime());
} else {
System.out.println(twoDate.getTime() + " after " + oneDate.getTime());
}
результаты
one: 1266873627200
two: 1266873627000
1266873627000 after 1266873627200