시간대의 차이와 관련하여 두 ZonedDateTime 간의 시차를 인쇄하는 방법을 작성하려고 합니다.
몇 가지 해결책을 찾았지만 모두 LocalDateTime 과 함께 작동하도록 작성되었습니다 .
시간대의 차이와 관련하여 두 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을 .
도움이 되었기를 바랍니다.
Duration.between( zdtA , zdtB )
표시된대로 . 나는 그 방법이 단순히 둘 다 호출 한다고 상상합니다 . between
ZonedDateTime::toInstant()
시, 분, 초 :
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() );
당신은을 얻을 수 Duration
에서 Interval
.
Duration d = interval.toDuration();
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)
.of
과 .between
. 감사.