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 Instantrepresenta un momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos .
Instant instant = Instant.now();
El toStringmé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 Instantclase 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 Instanttiene limitaciones como no tener opciones de formato para generar cadenas en formatos alternativos. Para mayor flexibilidad, convierta de Instanta OffsetDateTime. Especifique un desplazamiento de UTC . En java.time eso significa un ZoneOffsetobjeto. 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 Instantclase.
OffsetDateTime.now( ZoneOffset.UTC )
Ahora, con un OffsetDateTimeobjeto en la mano, puede usarlo DateTimeFormatterpara 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 ZoneIdpara 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 15lugar de 19horas. Instanty ZonedDateTimeambos 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.Datenunca 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.