developer tip

Oracle Tutorial 예제 코드에 표시된 Java 8 Instant 클래스에는 plusHours 메서드가 없습니다.

copycodes 2020. 10. 22. 08:12
반응형

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

InstantZonedDateTime

시간 추가시 이상 현상의 예를 살펴 보겠습니다. 구역화되면 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 시가됩니다.

참고URL : https://stackoverflow.com/questions/46763282/java-8-instant-class-not-have-plushours-method-despite-shown-in-oracle-tutorial

반응형