Количество дней между двумя отметками времени

У меня есть два значения метки времени. как

Timestamp date1;
    Timestamp date2;

Теперь я хочу найти нет. дней между этими двумя отметками времени, как в java

int no_of_days = difference(date2 - date1)

приведенные выше коды предназначены только для пояснения вопроса. просто игнорируйте ошибки кодирования.


person Sonu kumar    schedule 27.12.2018    source источник
comment
Вы имеете в виду число, кратное 24 часам? Вы имеете в виду, сколько дат в данном часовом поясе? например С 23:00 26.12.2018 по 27.12.2018 01:00 - это 0, 1 или 2 дня?   -  person Peter Lawrey    schedule 27.12.2018
comment
какую версию Java вы используете, так как это может повлиять на ответ.   -  person Chris J    schedule 27.12.2018
comment
да @PeterLawrey ...   -  person Sonu kumar    schedule 27.12.2018
comment
Я использую Java 8   -  person Sonu kumar    schedule 27.12.2018
comment
Так какой? все они разные варианты.   -  person Peter Lawrey    schedule 27.12.2018
comment
1 день @PeterLawrey   -  person Sonu kumar    schedule 27.12.2018
comment
Вы знаете, в каком часовом поясе хотите произвести расчет? Это время в один и тот же день в одних часовых поясах и в разные дни в других.   -  person Peter Lawrey    schedule 27.12.2018
comment
Класс Timestamp плохо спроектирован и давно устарел, он вам не понадобится в 2018 году. Вероятно, вы можете использовать Instant из _ 3_, современный API даты и времени Java, в противном случае какой-либо другой тип из этого API. Ради вас самих и для тех, кто видит ваш код после вас.   -  person Ole V.V.    schedule 28.12.2018


Ответы (3)


Для этого можно использовать Duration (работает для java 8):

Duration between = Duration.between(date1.toInstant(), date2.toInstant());

int no_of_days = between.get(ChronoUnit.DAYS);
person Schidu Luca    schedule 27.12.2018

Если вы используете Java8, это будет намного проще. Вот один из способов сделать это.

Duration.between(date1.toLocalDateTime(), date2.toLocalDateTime()).toDays();
person Ravindra Ranwala    schedule 27.12.2018

Другие ответы, приведенные здесь, пока обрабатывают только дневную единицу как фиксированное количество 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