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

В библиотеке классов Java есть класс с именем DateTime. DateTime имеет этот метод:

int daysBetween(DateTime other)

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

int secondsBetween(DateTime other)

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

Ответ 1

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

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

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

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

c.getTimeInMillis()

и выполните те же

Ответ 2

Вы должны сделать

org.joda.time.Seconds.secondBetween(date1, date2)

Ответ 3

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

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

int secondsBetween = (date1.getTime() - date2.getTime()) / 1000;

Ответ 4

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

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

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

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

Ответ 5

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

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

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

long elapsedTimeInSeconds = (t2 - t1) / 1000000000;

ИЗМЕНИТЬ

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

Также из Java Real Time doc:

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

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

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

Ответ 7

Вы можете использовать org.apache.commons.lang.time.DateUtils, чтобы сделать его более чистым:

(firstDate.getTime() - secondDate.getTime()) / DateUtils.MILLIS_PER_SECOND

Ответ 8

Я хотел бы дать современный ответ. Остальные ответы были хороши, когда задавали этот вопрос, но время идет. Сегодня я рекомендую использовать java.time, современный Java-интерфейс даты и времени.

    ZonedDateTime aDateTime = ZonedDateTime.of(2017, 12, 8, 19, 25, 48, 991000000, ZoneId.of("Europe/Sarajevo"));
    ZonedDateTime otherDateTime = ZonedDateTime.of(2017, 12, 8, 20, 10, 38, 238000000, ZoneId.of("Europe/Sarajevo"));

    long diff = ChronoUnit.SECONDS.between(aDateTime, otherDateTime);
    System.out.println("Difference: " + diff + " seconds");

Отпечатки:

Difference: 2689 seconds

ChronoUnit.SECONDS.between() работает с двумя объектами ZonedDateTime или двумя OffsetDateTime s, двумя LocalDateTime s и т.д.

Если вам нужно что-то еще, кроме секунд, вам следует рассмотреть возможность использования класса Duration:

    Duration dur = Duration.between(aDateTime, otherDateTime);
    System.out.println("Duration: " + dur);
    System.out.println("Difference: " + dur.getSeconds() + " seconds");

Отпечатки:

Duration: PT44M49.247S
Difference: 2689 seconds

Первая из двух строк печатает продолжительность в формате ISO 8601, выход означает длительность 44 минут и 49.247 секунд.

Почему java.time?

Класс Date, используемый в нескольких других ответах, теперь устарел. Joda-Time также используется в паре (и, возможно, в вопросе), теперь находится в режиме обслуживания, никаких серьезных усовершенствований не планируется, и разработчики официально рекомендуют переносить на java.time, также известный как JSR-310.

Вопрос: могу ли я использовать современный API с моей версией Java?

Если вы используете хотя бы Java 6, вы можете.

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

Используйте этот метод:

private Long secondsBetween(Date first, Date second){
    return (second.getTime() - first.getTime())/1000;
}