tl; dr
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
Evite depender del sistema operativo del host o JVM para la zona horaria predeterminada
Le recomiendo que escriba todo su código para indicar explícitamente la zona horaria deseada / esperada. No es necesario que dependa de la zona horaria predeterminada actual de la JVM. Y tenga en cuenta que la zona horaria predeterminada actual de la JVM puede cambiar en cualquier momento durante el tiempo de ejecución, con cualquier código en cualquier hilo de cualquier llamada de aplicación TimeZone.setDefault
. Tal llamada afecta a todas las aplicaciones dentro de esa JVM inmediatamente.
java.time
Algunas de las otras respuestas eran correctas, pero ahora están pasadas de moda. Las terribles clases de fecha y hora incluidas con las primeras versiones de Java tenían fallas, escritas por personas que no entendían las complejidades y sutilezas del manejo de la fecha y hora.
Las clases de fecha y hora heredadas han sido suplantadas por las clases java.time definidas en JSR 310.
Para representar una zona horaria, utilice ZoneId
. Para representar un desplazamiento de UTC, utilice ZoneOffset
. Un desplazamiento es simplemente un número de horas-minutos-segundos por delante o por detrás del primer meridiano. Una zona horaria es mucho más. Una zona horaria es un historial de los cambios pasados, presentes y futuros del desplazamiento utilizado por la gente de una región en particular.
Necesito forzar cualquier operación relacionada con el tiempo a GMT / UTC
Para una compensación de cero horas-minutos-segundos, use la constante ZoneOffset.UTC
.
Instant
Para capturar el momento actual en UTC, use un Instant
. Esta clase representa un momento en UTC, siempre en UTC por definición.
Instant instant = Instant.now() ; // Capture current moment in UTC.
ZonedDateTime
Para ver ese mismo momento a través del tiempo de reloj de pared utilizado por la gente de una región en particular, ajústese a una zona horaria. Mismo momento, mismo punto en la línea de tiempo, diferente hora de reloj de pared.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Base de datos
Mencionas una base de datos.
Para recuperar un momento de la base de datos, su columna debe ser de un tipo de datos similar al estándar SQL TIMESTAMP WITH TIME ZONE
. Recupere un objeto en lugar de una cadena. En JDBC 4.2 y posteriores, podemos intercambiar objetos java.time con la base de datos. El OffsetDateTime
es requerido por JDBC, mientras que Instant
y ZonedDateTime
son opcionales.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
En la mayoría de las bases de datos y controladores, supongo que obtendrá el momento como se ve en UTC. Pero si no es así, puede ajustarlo de dos formas:
- Extrae un
Instant
: odt.toInstant()
- Ajuste del desplazamiento dado a un desplazamiento de cero: OffsetDateTime odtUtc = odt.withOffsetSameInstant (ZoneOffset.UTC); `.
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.
¿Dónde obtener las clases java.time?