tl; dr
Use solo clases modernas de java.time . Nunca utilice las clases heredadas terribles como SimpleDateFormat
, Date
o java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
O utilice la zona horaria predeterminada actual de la JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time y JDBC 4.2
El enfoque moderno utiliza las clases java.time como se ve arriba.
Si su controlador JDBC cumple con JDBC 4.2 , puede intercambiar directamente objetos java.time con la base de datos. Uso PreparedStatement::setObject
y ResultSet::getObject
.
Utilice java.sql solo para controladores anteriores a JDBC 4.2
Si su controlador JDBC aún no cumple con JDBC 4.2 para el soporte de los tipos java.time , debe recurrir al uso de las clases java.sql.
Almacenamiento de datos.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Recuperando datos.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Los tipos java.sql, como por ejemplo java.sql.Timestamp
, solo deben usarse para transferir dentro y fuera de la base de datos. Convierta inmediatamente a tipos java.time en Java 8 y posterior.
java.time.Instant
Un java.sql.Timestamp
mapa a un java.time.Instant
, un momento en la línea de tiempo en UTC. Observe el nuevo método de conversión toInstant
agregado a la clase anterior.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Zona horaria
Aplique la zona horaria deseada / esperada ( ZoneId
) para obtener a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Cadenas formateadas
Usa a DateTimeFormatter
para generar tu cadena. Los códigos de patrón son similares a los de java.text.SimpleDateFormat
pero no exactamente, así que lea el documento detenidamente.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Este formato particular es ambiguo en cuanto a su significado exacto, ya que carece de cualquier indicación de desplazamiento de UTC o zona horaria.
ISO 8601
Si tiene algo que decir al respecto, le sugiero que considere usar formatos estándar ISO 8601 en lugar de usar el suyo. El formato estándar es bastante similar al tuyo. Por ejemplo:
2016-02-20T03:26:32+05:30
.
Las clases java.time usan estos formatos estándar de forma predeterminada, por lo que no es necesario especificar un patrón. La ZonedDateTime
clase amplía el formato estándar agregando el nombre de la zona horaria (una mejora inteligente).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Convierte a java.sql
Puede convertir de java.time a java.sql.Timestamp
. Extraer un Instant
de la ZonedDateTime
.
Se han agregado nuevos métodos a las clases antiguas para facilitar la conversión a / desde las clases java.time.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
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?
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 .