Другие ответы, приведенные здесь, пока обрабатывают только дневную единицу как фиксированное количество 24 часов с использованием класса java.time.Duration
. Если вы рассматриваете свои временные метки в контексте перехода на летнее время часовых поясов, то, вероятно, это не то, что вам нужно.
При переходе с зимнего времени на летнее календарный день может длиться всего 23 часа (а в некоторых редких случаях даже 23:30). А осенью при переходе на зимнее время календарные дни могут быть более 24 часов. Итак, вам также понадобится часовой пояс, чтобы справиться с этой ситуацией и правильно рассчитать продолжительность.
Предлагаемое решение, если ваши временные метки были сохранены в базе данных мгновенно:
ZonedDateTime zdt1 = date1.toInstant().atZone(ZoneId.systemDefault());
ZonedDateTime zdt2 = date2.toInstant().atZone(ZoneId.systemDefault());
long days = java.time.temporal.ChronoUnit.DAYS.between(zdt1, zdt2);
Конечно, вы можете указать любой другой пояс, кроме часового пояса системы. Результат может отличаться в зависимости от выбранной зоны.
Предлагаемое решение, если ваши временные метки были сохранены с LocalDateTime
без какого-либо контекста зоны:
LocalDateTime ldt1 = date1.toLocalDateTime();
LocalDateTime ldt2 = date2.toLocalDateTime();
long days = java.time.temporal.ChronoUnit.DAYS.between(ldt1, ldt2);
Здесь я по-прежнему предпочитаю enum ChronoUnit.DAYS
, потому что тип java.time.Duration
внутри хранит только секунды и наносекунды и, следовательно, скорее предназначен для машинных меток времени. И еще одно замечание: второе решение неявно использует часовой пояс вашей системы для преобразования из java.sql.Timestamp
в LocalDateTime
. Это правильно, только если вы так же сохранили свои временные метки.
Кстати, с драйвером, совместимым с JDBC-4.2, вы также можете получить ваш java.time
-тип напрямую, см. Также соответствующее сообщение здесь, на SO.
person
Meno Hochschild
schedule
28.12.2018
Timestamp
плохо спроектирован и давно устарел, он вам не понадобится в 2018 году. Вероятно, вы можете использоватьInstant
из _ 3_, современный API даты и времени Java, в противном случае какой-либо другой тип из этого API. Ради вас самих и для тех, кто видит ваш код после вас. - person Ole V.V.   schedule 28.12.2018