Когда я тестирую этот код:
java.util.Date date = new java.util.Date();
java.util.Date stamp = new java.sql.Timestamp(date.getTime());
assertTrue(date.equals(stamp));
assertTrue(date.compareTo(stamp) == 0);
assertTrue(stamp.compareTo(date) == 0);
assertTrue(stamp.equals(date));
Я буду ожидать истинного, истинного, истинного, ложного. Из-за этого:
В javadoc для java.sql.Timestamp указано:
Примечание. Этот тип является составной частью java.util.Date и отдельной наносекунды. Только целые секунды хранятся в компонент java.util.Date. Дробные секунды - нано - являются отдельный. Метод Timestamp.equals(Object) никогда не возвращает true, если передал значение типа java.util.Date, потому что компонент нано дата неизвестна. В результате метод Timestamp.equals(Object) не симметричный относительно java.util.Date.equals(Object) метод. Кроме того, метод hashcode использует базовый java.util.Date и поэтому не включает нано вычисление.
Из-за различий между классом Timestamp и java.util.Date, упомянутый выше, рекомендуется, чтобы код не просмотреть значения метки времени в качестве экземпляра java.util.Date. Отношение наследования между меткой времени и java.util.Date на самом деле означает наследование реализации, а не наследование типов.
Но вместо этого я получу истинное, ложное, истинное, ложное. Любые идеи?
EDIT: эта проблема возникает, когда я проверял два дата с помощью метода equals, но один из объектов Date исходил из класса Hibernate и отладки, я вижу, что объект содержит TimeStamp. Таким образом, метод equals оценивается как false, тогда я нашел это: http://mattfleming.com/node/141
Но когда я пытаюсь использовать код, я получаю разные результаты... если я не могу использовать ни равные, ни сравнивать, что я должен использовать, чтобы проверить, совпадают ли 2 Даты?!?!