Programing

Java에서 두 날짜 간의 차이를 어떻게 초 단위로 얻습니까?

crosscheck 2020. 11. 26. 07:54
반응형

Java에서 두 날짜 간의 차이를 어떻게 초 단위로 얻습니까?


Java 클래스 라이브러리에는 DateTime이라는 클래스가 있습니다. DateTime에는 다음 메서드가 있습니다.

int daysBetween(DateTime other)

이 값과 매개 변수 사이의 일 수를 반환합니다. 방법이 없습니다

int secondsBetween(DateTime other)

내가 필요한 것입니다. DateTime과 비슷한 클래스가 있지만 이러한 메서드가 있습니까?


DateTime에 익숙하지 않음 ...

두 개의 날짜가있는 경우 getTime을 호출하여 밀리 초를 구하고 diff를 구하고 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;

여기 관련 문서 : Date.getTime () . 1970 년 1 월 1 일 00:00:00 GMT 이후의 날짜에만 작동합니다.


나는 현대적인 대답을 제공하고 싶습니다. 이 질문을했을 때 다른 대답은 괜찮 았지만 시간이 흘러갑니다. 오늘 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객체 또는 두 개의 OffsetDateTimes, 두 개의 LocalDateTimes 등과 함께 작동합니다 .

초 외에 다른 것이 필요한 경우 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으로 알려진으로 마이그레이션 할 것을 권장합니다 .

질문 : Java 버전에서 최신 API를 사용할 수 있습니까?

Java 6 이상을 사용하는 경우 가능합니다.


DateTime표준 Java SE API 와 같은 클래스는 없습니다 . joda-time에 하나가 있지만 그것조차도 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;

편집하다

For more information about monoticity see the answer to a related question I asked, where possible nanoTime uses a monotonic clock. I have tested but only using Windows XP, Java 1.6 and modifying the clock whereby nanoTime was monotonic and currentTimeMillis wasn't.

Also from Java's Real time doc's:

Q: 50. Is the time returned via the real-time clock of better resolution than that returned by System.nanoTime()?

The real-time clock and System.nanoTime() are both based on the same system call and thus the same clock.

With Java RTS, all time-based APIs (for example, Timers, Periodic Threads, Deadline Monitoring, and so forth) are based on the high-resolution timer. And, together with real-time priorities, they can ensure that the appropriate code will be executed at the right time for real-time constraints. In contrast, ordinary Java SE APIs offer just a few methods capable of handling high-resolution times, with no guarantee of execution at a given time. Using System.nanoTime() between various points in the code to perform elapsed time measurements should always be accurate.


If you're using Joda (which may be coming as jsr 310 in JDK 7, separate open source api until then) then there is a Seconds class with a secondsBetween method.

Here's the javadoc link: http://joda-time.sourceforge.net/api-release/org/joda/time/Seconds.html#secondsBetween(org.joda.time.ReadableInstant,%20org.joda.time.ReadableInstant)


You can use org.apache.commons.lang.time.DateUtils to make it cleaner:

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

Which class ? Do you mean the Joda DateTime class ? If so, you can simply call getMillis() on each, and perform the appropriate subtraction/scaling.

I would recommend Joda for date/time work, btw, due to it's useful and intuitive API, and its thread-safety for formatting/parsing options.


Just a pointer: If you're calculating the difference between two java.util.Date the approach of subtracting both dates and dividing it by 1000 is reasonable, but take special care if you get your java.util.Date reference from a Calendar object. If you do so, you need to take account of daylight savings of your TimeZone since one of the dates you're using might take place on a DST period.

That is explained on Prasoon's link, I recommend taking some time to read it.


Use this method:

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

참고URL : https://stackoverflow.com/questions/1970239/in-java-how-do-i-get-the-difference-in-seconds-between-2-dates

반응형