В Java, как я получаю различие в секундах между 2 датами?

Библиотека классов Java имеет класс под названием DateTime. DateTime имеет этот метод:

int daysBetween(DateTime other)

который возвращает количество дней между этим и параметром. Это не имеет метода

int secondsBetween(DateTime other)

в котором я, оказывается, нуждаюсь. Существует ли класс, который подобен DateTime, но имеет такой метод?

64
задан snakile 25 December 2010 в 17:08
поделиться

7 ответов

Не знакомые с DateTime...

Если у вас две Даты, то вы можете вызвать getTime на них, чтобы получить миллисекунды, получить диф и поделить на 1000. Например

Date d1 = ...;
Date d2 = ...;
long seconds = (d2.getTime()-d1.getTime())/1000;

Если у вас есть объекты Календаря, вы можете вызвать

c.getTimeInMillis()

и сделать то же самое

.
155
ответ дан 24 November 2019 в 15:39
поделиться

Это должно сделать:

Date a = ...;
Date b = ...;

Math.abs(a.getTime()-b.getTime())/1000;

Вот соответствующая документация: Date.getTime(). Имейте в виду, что это будет работать только для дат после 1 января 1970 года, 00:00:00 GMT

.
7
ответ дан 24 November 2019 в 15:39
поделиться

В стандартном Java SE API отсутствует такой класс, как DateTime . Хотя есть один в joda-time, даже в нем нет метода daysBetween.

Используя стандартный Java API, проще всего получить секунды между двумя java.util. Объекты Date должны будут вычитать свои метки времени и делиться на 1000:

int secondsBetween = (date1.getTime() - date2.getTime()) / 1000;
5
ответ дан 24 November 2019 в 15:39
поделиться

Не рекомендуется использовать java.util.date или System.currentTimeMillis() для измерения истекшего времени. Эти даты не гарантированно являются монотонными и будут изменяться при изменении системных часов (например, при исправлении с сервера). Вероятно, это будет происходить редко, но почему бы не кодировать лучшее решение, а не беспокоиться о возможных отрицательных или очень больших изменениях?

Вместо этого я бы порекомендовал использовать System.nanoTime().

long t1 = System.nanoTime();
long t2 = System.nanoTime();

long elapsedTimeInSeconds = (t2 - t1) / 1000000000;

EDIT

Для получения более подробной информации о монотонности смотрите ответ на связанный с этим вопрос, где возможно, что в nanoTime используются монотонные часы. Я протестировал, но только в Windows XP, Java 1.6 и модифицировал часы, в которых nanoTime был монотонным, а currentTimeMillis - нет.

Также из Java's Real Time Doc's:

Q: 50. Возвращается ли время через часы реального времени с лучшим разрешением чем та, что была возвращена System.nanoTime()?

Часы реального времени и System.nanoTime() оба основаны на один и тот же системный вызов и, следовательно, один и тот же часы.

С Java RTS, все API, основанные на времени. (например, Таймеры, Периодические Нитки, Мониторинг Сроков и так далее... вперёд) исходя из таймер высокого разрешения. И, вместе с приоритетами в реальном времени, они могут убедиться, что соответствующий код быть выполненным в нужное время для ограничения в режиме реального времени. В отличие от этого, обычные Java SE API предлагают всего несколько методы, способные справиться времена высокого разрешения, без гарантия исполнения при заданном Время. Используя System.nanoTime() между различные пункты кода для выполнения измерения прошедшего времени должны всегда быть точным.

3
ответ дан 24 November 2019 в 15:39
поделиться

Если Вы используете Joda (которая может прийти как jsr 310 в JDK 7, до тех пор отделяйте api с открытым исходным кодом), то есть класс Seconds с методом secondsBetween.

Вот ссылка на javadoc: http://joda-time.sourceforge.net/api-release/org/joda/time/Seconds.html#secondsBetween(org.joda.time.ReadableInstant,%20org.joda.time.ReadableInstant)

3
ответ дан 24 November 2019 в 15:39
поделиться

Какой класс? Вы имеете в виду класс Joda DateTime ? Если да, то можно просто вызвать getMillis() на каждом из них и выполнить соответствующее вычитание/масштабирование.

Я бы порекомендовал Joda для работы с датой/временем, btw, благодаря его удобному и интуитивному API, а также его потокобезопасному для форматирования/парирования.

.
0
ответ дан 24 November 2019 в 15:39
поделиться

Просто указатель: Если вы вычисляете разницу между двумя java.util.Date, то подход вычитания обеих дат и деления на 1000 является разумным, но будьте особенно внимательны, если вы получаете ссылку на java.util.Date из объекта "Календарь". Если Вы сделаете это, то Вам нужно будет учесть летнюю экономию Вашего TimeZone, так как одна из дат, которую Вы используете, может иметь место в период DST.

Это объясняется в ссылке Prasoon, я рекомендую потратить некоторое время, чтобы прочитать ее.

.
0
ответ дан 24 November 2019 в 15:39
поделиться
Другие вопросы по тегам:

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