Java 8 : 두 ZonedDateTime의 차이 계산


80

시간대의 차이와 관련하여 두 ZonedDateTime 간의 시차를 인쇄하는 방법을 작성하려고 합니다.

몇 가지 해결책을 찾았지만 모두 LocalDateTime 과 함께 작동하도록 작성되었습니다 .


2
달성하려는 구체적인 예를 게시하고 그 결과를 얻으십시오.
JB Nizet 2016

2
Michał의 대답은 정확히 내가 기대했던 것입니다. 감사합니다!
Maggie Hill

답변:


102

당신이 방법을 사용할 수 있습니다 사이 에서 ChronoUnit .

이 메서드는 해당 시간을 동일한 영역 (첫 번째 인수의 영역)으로 변환하고 그 후 Temporal 인터페이스 에서 선언 된 until 메서드를 호출합니다 .

static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

ZonedDateTimeLocalDateTime은 모두 Temporal 인터페이스를 구현 하므로 해당 날짜-시간 유형에 대한 범용 메서드도 작성할 수 있습니다.

static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

그러나 혼합이 방법 호출 것을 명심 LocalDateTimeZonedDateTime의 에 리드 DateTimeException을 .

도움이 되었기를 바랍니다.


두 ZDT간에 ZoneId가 다른 두 ZDT 유형 간의 차이를 얻을 수있는 방법이 있습니까?
stanlick

@stanlick 예 : 내 답변에Duration.between( zdtA , zdtB ) 표시된대로 . 나는 그 방법이 단순히 둘 다 호출 한다고 상상합니다 . betweenZonedDateTime::toInstant()
Basil Bourque

73

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

또 다른 경로는 DurationPeriod클래스입니다. 첫 번째는 짧은 시간 (시간, 분, 초)에 사용하고 두 번째는 더 긴 시간 (년, 월, 일)에 사용합니다.

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() );

당신은을 얻을 수 Duration에서 Interval.

Duration d = interval.toDuration();

Java 및 ThreeTen-Extra 프로젝트의 시간 범위 클래스 표


java.time 정보

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 될 수있는 가능성을 입증하는 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


of두 순간이 걸리는 Duration 의 메소드를 어디에서보고 계십니까? 나만 본다public static Duration of(long amount, TemporalUnit unit)
Brian Gordon

@BrianGordon는 대체 수정 .of.between. 감사.
Basil Bourque

Duration은 ZonedDateTime에서 작동하는 반면 Period는 LocalDate에서 작동합니다. toLocalDate () 메서드에 대한 호출은 zdt 객체에서 수행되어야합니다.
guillaume guerin 18.03.02

1
@guillaumeguerin 맞습니다. 내 코드 예제를 수정했습니다. 감사.
Basil Bourque

오, 정말 고마워요, 당신의 예는 꽤 좋습니다 !!!!
Brendon Iwata
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.