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


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

int daysBetween(DateTime other)

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

int secondsBetween(DateTime other)

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

11 53

11 ответов:

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

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

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

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

c.getTimeInMillis()

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

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

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

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

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

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

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

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

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

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

не рекомендуется использовать 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 в режиме реального времени doc:

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

часы реального времени и Система.nanoTime() основаны на тот же системный вызов и так же часы.

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

Если вы используете 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)

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

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

я хотел бы дать современный ответ. Другие ответы были прекрасны, когда этот вопрос был задан, но время идет. Сегодня я рекомендую вам использовать java.time, современный JAVA дата и время API.

    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, etc.

Если вам нужно что-нибудь еще, кроме секунд, вы должны рассмотреть возможность использования 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.время?

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

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

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

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

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

просто указатель: Если вы вычисляете разницу между двумя java.утиль.Дата подход вычитания обеих дат и деления его на 1000 является разумным, но будьте особенно осторожны, если вы получаете свой java.утиль.Ссылка на дату из объекта календаря. Если вы это сделаете, вам нужно учитывать летнее время Вашего часового пояса, так как одна из дат, которые вы используете, может иметь место в период DST.

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

использовать этот метод:

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