developer tip

Java 8 : 두 ZonedDateTime의 차이 계산

copycodes 2021. 1. 6. 08:30
반응형

Java 8 : 두 ZonedDateTime의 차이 계산


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

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


당신이 방법을 사용할 수 있습니다 사이 에서 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을 .

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


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

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?

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

반응형