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
객체 또는 두 개의 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으로 알려진으로 마이그레이션 할 것을 권장합니다 .
질문 : Java 버전에서 최신 API를 사용할 수 있습니까?
Java 6 이상을 사용하는 경우 가능합니다.
- Java 8 이상에서는 새 API가 내장되어 있습니다.
- Java 6 및 7 에서는 새 클래스의 백 포트 인 ThreeTen Backport를 가져 옵니다 ( JSR 310의 경우 ThreeTen ).
- Android에서는 ThreeTen Backport의 Android 버전을 사용합니다. ThreeTenABP라고하며이 질문에는 Android Project에서 ThreeTenABP를 사용하는 방법에 대한 자세한 설명 이 있습니다.
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()
측정 하는 것은 권장하지 않습니다 . 이러한 날짜는 단조 롭다고 보장되지 않으며 시스템 시계가 수정 될 때 (예 : 서버에서 수정 된 경우) 변경됩니다. 드물게 발생하지만 부정적이거나 매우 큰 변화에 대해 걱정하는 것보다 더 나은 솔루션을 코딩하는 것은 어떨까요?
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;
}
'Programing' 카테고리의 다른 글
WPF에서 전체 TreeViewItem 줄 강조 표시 (0) | 2020.11.27 |
---|---|
asp.net MVC3 razor : 사용자 역할에 따라 액션 링크 표시 (0) | 2020.11.26 |
방법 : Ubuntu 11.10에 Imagick (php 용) 설치 (0) | 2020.11.26 |
애플리케이션 컨텍스트 초기화 이벤트에 후크를 추가하는 방법은 무엇입니까? (0) | 2020.11.26 |
dplyr의 문자열 열에서 여러 값 필터링 (0) | 2020.11.26 |