java.util. Timestamp.after () неправильно при сравнении миллисекунд?

Я вытаскиваю даты из базы данных 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 хранятся отдельно от экземпляра Даты в классе Метки времени, и мне любопытно, если это - проблема.

10
задан BestPractices 23 February 2010 в 20:56
поделиться

4 ответа

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

if(date1.getTime() > date2.getTime()) {
  //...
}
4
ответ дан 4 December 2019 в 03:16
поделиться

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

РЕДАКТИРОВАТЬ.

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

0
ответ дан 4 December 2019 в 03:16
поделиться

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

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

0
ответ дан 4 December 2019 в 03:16
поделиться

Ключ к проблеме здесь - когда метки времени приводятся к объектам 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
2
ответ дан 4 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: