java - una - ver procesos en ejecucion oracle
La clase Java 8 Instant no tiene el método plusHours a pesar de que se muestra en el código de ejemplo de Oracle Tutorial (1)
El tutorial de Oracle es incorrecto
Desafortunadamente, el Tutorial de Oracle es incorrecto en este asunto. Esa línea de código de ejemplo es simplemente incorrecta. Buena captura de tu parte.
Este error es bastante desafortunado ya que el Tutorial es un excelente recurso para aprender y estudiar Java.
Instant::plus
La clase
Instant
no tiene un método como
plusHours
definido en Java 8 o Java 9.
En su lugar, puede llamar al método
plus
y especificar horas.
Instant later = instant.plus( 1 , ChronoUnit.HOURS ) ;
ZonedDateTime::plusHours
La clase
Instant
es una clase básica de bloques de construcción, que indica un momento en la línea de tiempo en
UTC
.
Por lo general, al realizar manipulaciones como agregar horas, es probable que desee tener en cuenta las anomalías como el
horario de verano
, por lo que le interesará la
zona horaria
.
Para eso, use la clase
ZonedDateTime
.
Esa clase ofrece un método conveniente
plusHours
, una fuente probable de confusión para los autores del
Tutorial
.
Especifique un
nombre de zona horaria adecuado
en el formato de
continent/region
, como
America/Montreal
,
Africa/Casablanca
o
Pacific/Auckland
.
Nunca use la abreviatura de 3-4 letras, como
EST
o
IST
ya que
no
son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!).
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
versus
ZonedDateTime
Veamos un ejemplo de anomalía al agregar horas. Cuando se divide en zonas, agregamos una hora al momento particular de la 1 AM el 23 de marzo de 2017 y, por supuesto, esperamos las 2 AM, pero nos sorprende ver las 3 AM. Sin embargo, cuando consideramos el mismo momento en UTC en lugar de esa zona horaria en particular, el mismo punto en la línea de tiempo, agregando una hora se comporta como se esperaba.
Esta anomalía particular se debe a la adopción del
horario de verano (DST)
en la mayor parte de América del Norte, en particular aquí, la zona horaria
America/New_York
.
En la primavera, los relojes "adelantan" una hora.
Cuando los relojes dan las 2 AM, saltan a las 3 AM.
Así que la hora de las dos en punto nunca existió ese día.
// 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." ) ;
Vea este código en vivo en IdeOne.com .
zdt: 2017-03-12T01: 00-05: 00 [América / Nueva_York]
zdtOneHourLater: 2017-03-12T03: 00-04: 00 [América / Nueva_York]
¡Ay! ¿1 AM más una hora son las 3 AM? Sí, esa es una anomalía conocida como horario de verano (DST).
instantáneo: 2017-03-12T06: 00: 00Z
instantOneHourLater: 2017-03-12T07: 00: 00Z
Instantáneo siempre está en UTC. Entonces no hay anomalías, no hay horario de verano. Agregar una hora a la 1 AM resulta en 2 AM cada vez.
La
página
Tutorial de Oracle
para la clase
Instant
muestra este código de ejemplo:
Instant oneHourLater = Instant.now().plusHours(1);
Cuando intento compilar este código, el compilador arroja el error:
- Error
InstantPrint.java:6: error: cannot find symbol Instant oneHourLater = Instant.now().plusHours(1); ^ symbol: method plusHours(int) location: class Instant
Pero esta documentación de Java menciona el método
plusHours()
, pero
plusHours()
esta clase
Instant
y no contiene el método
plusHours()
.
A partir de entonces, ¿por qué mencionar este método
plusHours()
en el ejemplo?