Java 8 : 두 ZonedDateTime의 차이 계산
시간대의 차이와 관련하여 두 ZonedDateTime 간의 시차를 인쇄하는 방법을 작성하려고 합니다.
몇 가지 해결책을 찾았지만 모두 LocalDateTime 과 함께 작동하도록 작성되었습니다 .
당신이 방법을 사용할 수 있습니다 사이 에서 ChronoUnit .
이 메소드는 해당 시간을 동일한 영역 (첫 번째 인수의 영역)으로 변환 한 후 Temporal 인터페이스 에서 선언 된 until 메소드를 호출합니다 .
static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
return unit.between(d1, d2);
}
ZonedDateTime 과 LocalDateTime은 모두 Temporal 인터페이스를 구현 하므로 해당 날짜-시간 유형에 대한 범용 메서드를 작성할 수도 있습니다.
static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
return unit.between(d1, d2);
}
그러나 혼합이 방법 호출 것을 명심 LocalDateTime 및 ZonedDateTime의 에 리드 DateTimeException을 .
도움이 되었기를 바랍니다.
tl; dr
시, 분, 초 :
Duration.between( zdtA , zdtB ) // Represent a span-of-time in terms of days (24-hour chunks of time, not calendar days), hours, minutes, seconds. Internally, a count of whole seconds plus a fractional second (nanoseconds).
년, 월, 일 :
Period.between( // Represent a span-of-time in terms of years-months-days.
zdtA.toLocalDate() , // Extract the date-only from the date-time-zone object.
zdtB.toLocalDate()
)
세부
Michal S 의 답변 이 정확합니다 ChronoUnit
.
Duration
& Period
또 다른 경로는 Duration
및 Period
클래스입니다. 첫 번째는 짧은 시간 (시간, 분, 초)에 사용하고 두 번째는 더 긴 시간 (년, 월, 일)에 사용합니다.
Duration d = Duration.between( zdtA , zdtB );
를 호출 하여 표준 ISO 8601 형식 으로 문자열을 생성 합니다toString
. 형식은 PnYnMnDTnHnMnS
를 Where P
마크 시작하고 T
두 부분을 분리한다.
String output = d.toString();
Java 9 이상에서는 to…Part
메서드를 호출 하여 개별 구성 요소를 가져옵니다. 내 다른 답변 에서 논의했습니다 .
예제 코드
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtStart = ZonedDateTime.now( z );
ZonedDateTime zdtStop = zdtStart.plusHours( 3 ).plusMinutes( 7 );
Duration d = Duration.between( zdtStart , zdtStop );
2016-12-11T03 : 07 : 50.639-05 : 00 [미주 / 몬트리올] /2016-12-11T06:14:50.639-05:00 [미주 / 몬트리올]
PT3H7M
IdeOne.com에서 라이브 코드를 참조하십시오 .
Interval
& LocalDateRange
ThreeTen - 추가 프로젝트는 java.time 클래스에 기능을 추가합니다. 편리한 클래스 중 하나는 Interval
시간 범위를 타임 라인의 한 쌍의 포인트로 표현하는 것입니다. 다른 하나는 LocalDateRange
한 쌍의 LocalDate
객체에 대한입니다. 반대로 Period
& Duration
클래스는 각각 타임 라인에 첨부 되지 않은 시간 범위를 나타냅니다 .
에 대한 팩토리 메서드 Interval
는 한 쌍의 Instant
개체를 사용합니다.
Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );
You can obtain a Duration
from an Interval
.
Duration d = interval.toDuration();
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date
, Calendar
, & SimpleDateFormat
.
The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.*
classes.
Where to obtain the java.time classes?
- Java SE 8, Java SE 9, Java SE 10, and later
- Built-in.
- Part of the standard Java API with a bundled implementation.
- Java 9 adds some minor features and fixes.
- Java SE 6 and Java SE 7
- Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
- Android
- Later versions of Android bundle implementations of the java.time classes.
- For earlier Android (<26), the ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See How to use ThreeTenABP….
The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval
, YearWeek
, YearQuarter
, and more.
ReferenceURL : https://stackoverflow.com/questions/41077142/java-8-calculate-difference-between-two-zoneddatetime
'developer tip' 카테고리의 다른 글
Java 8 새 날짜 및 시간 API에 대한 JPA 지원 (0) | 2021.01.06 |
---|---|
스택 맵 프레임이란? (0) | 2021.01.06 |
값 개체는 데이터베이스에 어떻게 저장됩니까? (0) | 2021.01.06 |
jQuery UI Datepicker에서 minDate를 현재 날짜로 설정하는 방법은 무엇입니까? (0) | 2021.01.05 |
R에서 중복 값 찾기 (0) | 2021.01.05 |