tl; dr
Instant.now()
java.time
Las problemáticas clases antiguas de fecha y hora incluidas con las primeras versiones de Java han sido suplantadas por las clases java.time integradas en Java 8 y posteriores. Consulte el tutorial de Oracle . Gran parte de la funcionalidad se ha actualizado a Java 6 y 7 en ThreeTen-Backport y se ha adaptado aún más a Android en ThreeTenABP .
Instant
An Instant
representa un momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos .
Instant instant = Instant.now();
El toString
método genera un objeto String con texto que representa el valor de fecha y hora utilizando uno de los formatos estándar ISO 8601 .
String output = instant.toString();
2016-06-27T19: 15: 25.864Z
La Instant
clase es una clase básica de bloques de construcción en java.time. Esta debería ser su clase de referencia cuando maneje la fecha y hora, ya que generalmente la mejor práctica es rastrear, almacenar e intercambiar valores de fecha y hora en UTC.
OffsetDateTime
Pero Instant
tiene limitaciones como no tener opciones de formato para generar cadenas en formatos alternativos. Para mayor flexibilidad, convierta de Instant
a OffsetDateTime
. Especifique un desplazamiento de UTC . En java.time eso significa un ZoneOffset
objeto. Aquí queremos seguir con UTC (+00) para poder usar la constante conveniente ZoneOffset.UTC
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T19: 15: 25.864Z
O salte la Instant
clase.
OffsetDateTime.now( ZoneOffset.UTC )
Ahora, con un OffsetDateTime
objeto en la mano, puede usarlo DateTimeFormatter
para crear objetos String con texto en formatos alternativos. Busque Stack Overflow para ver muchos ejemplos de uso DateTimeFormatter
.
ZonedDateTime
Cuando desee mostrar la hora del reloj de pared para una zona horaria en particular, aplique un ZoneId
para obtener un ZonedDateTime
.
En este ejemplo, aplicamos la zona horaria de Montreal. En el verano, según la tontería del horario de verano (DST) , la zona tiene una compensación de -04:00
. Observe que la hora del día es cuatro horas antes en la salida, en 15
lugar de 19
horas. Instant
y ZonedDateTime
ambos representan el mismo momento simultáneo, visto a través de dos lentes diferentes.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
2016-06-27T15: 15: 25.864-04: 00 [América / Montreal]
Mudado
Si bien debe evitar las antiguas clases de fecha y hora, si es necesario, puede convertir utilizando nuevos métodos agregados a las antiguas clases. Aquí usamos java.util.Date.from( Instant )
y java.util.Date::toInstant
.
java.util.Date utilDate = java.util.Date.from( instant );
Y yendo en la otra dirección.
Instant instant= utilDate.toInstant();
De manera similar, busque nuevos métodos agregados a GregorianCalendar
(subclase de Calendar
) para convertir ay desde java.time.ZonedDateTime
.
Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date
, Calendar
, y SimpleDateFormat
.
Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan java.sql.*
clases. Hibernate 5 y JPA 2.2 admiten java.time .
¿Dónde obtener las clases java.time?
java.util.Date
nunca es una fecha de máquina local. Siempre se define como milisegundos transcurridos desde 1970-01-01 en relación con UTC + 00: 00. Tal vez el comportamiento de su método lotoString()
confunda, ya que de hecho usa una representación en la zona horaria local.