требуется сравнение даты java

1

Я пытаюсь сравнить две даты. Вот мой код сравнения даты...

Date dbLastModified = getBulletinBarMessageLastModified();
Date bulletinBarMessageLastModified = bulletinBarForm.getLastModified();

if (dbLastModified.after(bulletinBarMessageLastModified)){
    throw new ReportingManagerOptimisticLockingException(optimisticLockingMessage);
}

public Date getBulletinBarMessageLastModified() {
    Timestamp lastModifiedTimestamp = getJdbcTemplate().queryForObject(BULLETIN_BAR_MSG_LAST_MODIFIED_SQL,Timestamp.class);
    Date lastModifiedDate = new Date(lastModifiedTimestamp.getTime());
    return lastModifiedDate;
}

...

dbLastModified  - Tue Apr 01 22:29:04 EST 2014
bulletinBarMessageLastModified  - Tue Apr 01 22:29:04 EST 2014

Я смущен тем, почему даже когда некоторые даты кажутся равными (например, эти два), почему мой код бросает исключение ReportingManagerOptimisticLockingException, подразумевая, что он один за другим. Является ли мое понимание сопоставлений даты неправильным?

  • 4
    Даты хранятся в миллисекундах, поэтому они, вероятно, на самом деле отличаются в миллисекундах, даже если они выглядят одинаково.
  • 2
    Метки времени не работают надежно как тип данных версии. С одной стороны, разрешение метки времени на вашем клиенте может отличаться от ОС БД и самой БД. И даже при достаточно высоком разрешении будут случаи, когда два обновления происходят в один и тот же момент и не распознаются как разные версии.
Показать ещё 1 комментарий
Теги:
datetime

3 ответа

3
Лучший ответ

Timestamp.getTime() рассматривает наносекунды. Таким образом, даже toString() возвращает один и тот же результат, на самом деле существует разница в nano.

Но java.util.Date только с миллисекундами.

  • 0
    На самом деле, нет. after сделок с датами, поэтому он сравнивает только миллисекунды. Похоже, есть разница в миллисекундах, но поскольку OP печатает даты с точностью до секунды, это не будет отображаться. TimeStamp в TimeStamp имеют к этому никакого отношения.
1
getDateDiff(date1,date2,TimeUnit.MINUTES);
1

Вот

вы можете прочитать следующее:

после

public boolean after (Дата когда)

Tests if this date is after the specified date.

Parameters:
    when - a date. 
Returns:
    true if and only if the instant represented by this Date object is strictly later than the instant represented by when; false

в противном случае. Броски: NullPointerException - если значение равно null.

Теперь это либо ошибка Java либо dbLastModified действительно после bulletinBarMessageLastModified с несколькими наносекундами.

Если значение false:

dbLastModified.after(dbLastModified)

то это, вероятно, не ошибка Java, но бывает так, что вторая дата после первого с несколькими наносекундами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню