java.util.Timestamp.after () неправильно при сравнении миллисекунд? - PullRequest
10 голосов
/ 23 февраля 2010

Я вытаскиваю даты из базы данных Oracle. Они установлены в поле java.util.Date и в действительности являются экземплярами java.sql.Timestamp (который является подклассом Java.util.Date). Если я сравниваю две из этих временных меток из двух разных записей базы данных, вызывая after () для первой даты, и сравниваю ее со второй, я получаю неправильный ответ, когда все части даты совпадают, за исключением миллисекунд.

Все перечисленное ниже должно приводить к значению «истина», однако второй набор чисел - нет:

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 

Я знаю, что нано хранятся отдельно от экземпляра Date в классе Timestamp, и мне интересно, если это проблема.

Ответы [ 4 ]

4 голосов
/ 23 февраля 2010

Вы можете сравнить их, но только сравнивая миллис. Хотя это довольно некрасиво, похоже, работает во всех случаях (независимо от того, java.sql.Timestamp или java.util.Date).

if(date1.getTime() > date2.getTime()) {
  //...
}
2 голосов
/ 09 марта 2010

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

Полагаю, мне сейчас нужен урок по параметрам ковариантного метода , почему метод после в 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
0 голосов
/ 23 февраля 2010

Без реального кода это предположение, но я думаю, что один из ваших объектов - java.util.Date, а другой - java.sql.Timestamp, вы не можете их реально сравнить, так как поле millis в 'Timestamp' усекается секунда, а остаток сохраняется в поле nanos. К сожалению, Timestamp является подклассом Date. Это определенно приводит к проблеме, с которой вы столкнулись.

EDIT.

Еще одна возможность заключается в том, что ваш драйвер БД возвращает свой собственный подкласс Timestamp. Поскольку класс не является окончательным, вполне возможно, что его реализация испортила compare Timestamp, но это не особенно сложно сделать.

0 голосов
/ 23 февраля 2010

Похоже, проблема в том, что firstDate и secondDate установлены на объекты Java.util.Date, но JavaDoc для java.sql.Timestamp упоминает, что это составная часть java. util.Date и отдельное значение наносекунды.

Вот почему он возвращает ложь, когда вы пытаетесь сравнить их. Если вы изменили firstDate и secondDate на фактические объекты Timestamp, они должны работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...