Oracle Tutorial 예제 코드에 표시된 Java 8 Instant 클래스에는 plusHours 메서드가 없습니다.
클래스 의 Oracle Tutorial 페이지Instant
는 다음 예제 코드를 보여줍니다.
Instant oneHourLater = Instant.now().plusHours(1);
이 코드를 컴파일하려고하면 컴파일러에서 오류가 발생합니다.
- 오류
InstantPrint.java:6 : 오류 : 기호를 찾을 수 없습니다. 인스턴트 oneHourLater = Instant.now (). plusHours (1); ^ symbol : 메서드 plusHours (int) 위치 : 클래스 인스턴트
그러나이 Java 문서는 plusHours()
메소드를 언급 하지만이 Instant
클래스를 확인 하고 plusHours()
메소드를 포함하지 않습니다 .
그런 plusHours()
다음 예제 에서이 방법을 언급하는 이유 는 무엇입니까?
오라클 튜토리얼은 잘못
불행히도 Oracle Tutorial 은이 문제에 대해 올바르지 않습니다. 예제 코드 줄은 단순히 잘못되었습니다. 잘 잡으세요.
이 오류는 자습서가 Java를 배우고 공부하는 데 유용한 리소스이므로 매우 불행합니다.
Instant::plus
Instant
클래스로 그런 방법이 없습니다 plusHours
중 자바 (8) 또는 Java (9)에서 정의합니다.
대신 plus
메서드를 호출하고 시간을 지정할 수 있습니다 .
Instant later = instant.plus( 1 , ChronoUnit.HOURS ) ;
ZonedDateTime::plusHours
이 Instant
클래스는 기본 구성 요소 클래스로, 타임 라인의 순간을 UTC로 표시 합니다. 일반적으로 시간 추가와 같은 조작을 수행 할 때 일광 절약 시간 과 같은 예외 사항을 고려할 수 있으므로 시간대에 주의해야 합니다 . 이를 위해 ZonedDateTime
클래스를 사용하십시오 . 이 클래스 는 튜토리얼 작성자에게 plusHours
혼란을 줄 수있는 편리한 방법을 제공합니다 .
지정 적절한 시간대 이름 의 형식 continent/region
예컨대, America/Montreal
, Africa/Casablanca
, 또는 Pacific/Auckland
. EST
또는 IST
과 같은 3-4 자의 약어 는 표준 시간대 가 아니고 , 표준화되지 않았으며, 고유하지도 않은 (!)이므로 사용하지 마십시오.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, but viewed through the lens of a region’s wall-clock time.
ZonedDateTime zdtLater = zdt.plusHours( 1 ) ;
Instant
대 ZonedDateTime
시간 추가시 이상 현상의 예를 살펴 보겠습니다. 구역화되면 2017 년 3 월 23 일 오전 1시의 특정 순간에 한 시간을 추가하고 물론 오전 2시를 예상하지만 오전 3시를보고 놀랍습니다. 그러나 특정 시간대가 아닌 UTC에서 매우 동일한 순간을 고려할 때 타임 라인에서 동일한 지점이 예상대로 작동합니다.
이 특별한 이상 현상은 대부분의 북미 지역, 특히 여기에서는 시간대에서 일광 절약 시간 (DST) 을 채택했기 때문 America/New_York
입니다. 봄에는 시계가 한 시간 "전진"합니다. 시계가 오전 2시에 도달하면 오전 3 시로 점프합니다. 그래서 그날 2 시가 존재하지 않았습니다.
// ZonedDateTime
LocalDate ld = LocalDate.of( 2017 , Month.MARCH , 12 ) ;
LocalTime lt = LocalTime.of( 1 , 0 ) ;
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
ZonedDateTime zdtOneHourLater = zdt.plusHours( 1 ) ;
System.out.println( "zdt: " + zdt ) ;
System.out.println( "zdtOneHourLater: " + zdtOneHourLater ) ;
System.out.println( "Yikes! 1 AM plus an hour is 3 AM? Yes, that is an anomaly known as Daylight Saving Time (DST)." ) ;
System.out.println( "" ) ;
// Instant
Instant instant = zdt.toInstant() ; // Adjust into UTC. Same moment, same point on the timeline, but viewed by a different wall-clock.
Instant instantOneHourLater = instant.plus( 1 , ChronoUnit.HOURS ) ;
System.out.println( "instant: " + instant ) ;
System.out.println( "instantOneHourLater: " + instantOneHourLater ) ;
System.out.println( "Instant is always in UTC. So no anomalies, no DST. Adding an hour to 1 AM results in 2 AM every time." ) ;
이 코드는 IdeOne.com에서 실시간으로 실행 됩니다.
zdt : 2017-03-12T01 : 00-05 : 00 [America / New_York]
zdtOneHourLater : 2017-03-12T03 : 00-04 : 00 [America / New_York]
이런! 오전 1시 + 1 시간은 오전 3시입니까? 예, 이는 일광 절약 시간 (DST)으로 알려진 예외입니다.
즉시 : 2017-03-12T06 : 00 : 00Z
instantOneHourLater : 2017-03-12T07 : 00 : 00Z
순간 검색은 항상 UTC입니다. 따라서 이상 징후도없고 DST도 없습니다. 오전 1시에 한 시간을 추가하면 매번 오전 2 시가됩니다.
'developer tip' 카테고리의 다른 글
불법 반사 접근이란 무엇입니까 (0) | 2020.10.22 |
---|---|
REST 및 SOAP 웹 서비스를 비교하고 대조합니까? (0) | 2020.10.22 |
왜 당신의 switch 문 데이터 유형이 길지 않습니까, Java? (0) | 2020.10.22 |
Android : 블루투스 UUID는 어떻게 작동하나요? (0) | 2020.10.22 |
Jupyter / iPython에서 플롯을 동적으로 업데이트하는 현재 올바른 방법은 무엇입니까? (0) | 2020.10.22 |