tl; dr
El proyecto Joda-Time está en modo de mantenimiento, ahora suplantado por las clases java.time .
- Solo usa la
java.time.Instant
clase.
- No hay necesidad de:
LocalDateTime
java.sql.Timestamp
- Instrumentos de cuerda
Capture el momento actual en UTC.
Instant.now()
Para almacenar ese momento en la base de datos:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Para recuperar ese momento de la base de datos:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Para ajustar la hora del reloj de pared a la de una zona horaria particular.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
es la clase equivocada
Otras respuestas son correctas, pero no señalan que esa LocalDateTime
es la clase incorrecta para su propósito.
Tanto en java.time como en Joda-Time , a LocalDateTime
propósito carece de cualquier concepto de zona horaria o desplazamiento desde UTC. Como tal, no representa un momento y no es un punto en la línea de tiempo. A LocalDateTime
representa una idea aproximada sobre los momentos potenciales en un rango de aproximadamente 26-27 horas.
Utilice a LocalDateTime
para cuando la zona / desplazamiento es desconocida (no es una buena situación), o cuando la zona de desplazamiento es indeterminada. Por ejemplo, "La Navidad comienza en el primer momento del 25 de diciembre de 2018" se representaría como un LocalDateTime
.
Use a ZonedDateTime
para representar un momento en una zona horaria particular. Por ejemplo, la Navidad comienza en cualquier zona en particular, como Pacific/Auckland
o America/Montreal
se representaría con un ZonedDateTime
objeto.
Por un momento siempre en UTC, use Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Aplicar una zona horaria. El mismo momento, el mismo punto en la línea de tiempo, pero se ve con una hora de reloj de pared diferente.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Entonces, si puedo convertir entre LocalDate y LocalDateTime,
No, estrategia equivocada. Si tiene un valor de solo fecha y desea un valor de fecha y hora, debe especificar una hora del día. Esa hora del día puede no ser válida en esa fecha para una zona en particular, en cuyo caso la ZonedDateTime
clase ajusta automáticamente la hora del día según sea necesario.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Si desea que el primer momento del día sea su hora del día, deje que java.time determine ese momento. No asuma que el día comienza a las 00:00:00. Anomalías como el horario de verano (DST) significa que el día puede comenzar en otro momento como 01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
es la clase equivocada
Esto java.sql.Timestamp
forma parte de las problemáticas clases antiguas de fecha y hora que ahora son heredadas, suplantadas completamente por las clases java.time . Esa clase se utilizó para representar un momento en UTC con una resolución de nanosegundos . Ese propósito ahora se cumple java.time.Instant
.
JDBC 4.2 con getObject
/setObject
A partir de JDBC 4.2 y posterior, su controlador JDBC puede intercambiar directamente objetos java.time con la base de datos llamando a:
Por ejemplo:
myPreparedStatement.setObject( … , instant ) ;
... y ...
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Convertir legado gacy moderno
Si debe interactuar con el código antiguo que aún no se ha actualizado a java.time , convierta de un lado a otro utilizando los nuevos métodos agregados a las clases antiguas.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…y…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
Sobre 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
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
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 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de java.sql.*
clases.
¿Dónde obtener las clases java.time?
- Java SE 8 , Java SE 9 y posterior
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Androide
- Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time.
- Para anteriormente Android (<26), el ThreeTenABP proyecto adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo utilizar ThreeTenABP ... .
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más .
java.sql.Timestamp
clase ahora es heredada, suplantada por las clases java.time , específicamente porInstant
.