tl; dr
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
Evite depender do sistema operacional host ou JVM para o fuso horário padrão
Eu recomendo que você escreva todo o seu código para declarar explicitamente o fuso horário desejado / esperado. Você não precisa depender do fuso horário padrão atual da JVM. E esteja ciente de que o fuso horário padrão atual da JVM pode mudar a qualquer momento durante o tempo de execução, com qualquer código em qualquer thread de qualquer chamada de aplicativo TimeZone.setDefault
. Tal chamada afeta todos os aplicativos dentro dessa JVM imediatamente.
java.time
Algumas das outras respostas estavam corretas, mas agora estão fora de moda. As terríveis classes de data e hora empacotadas com as primeiras versões do Java eram falhas, escritas por pessoas que não entendiam as complexidades e sutilezas do tratamento de data e hora.
As classes legadas de data e hora foram substituídas pelas classes java.time definidas no JSR 310.
Para representar um fuso horário, use ZoneId
. Para representar um deslocamento do UTC, use ZoneOffset
. Um deslocamento é apenas algumas horas-minutos-segundos à frente ou atrás do meridiano principal. Um fuso horário é muito mais. Um fuso horário é uma história das alterações passadas, presentes e futuras do deslocamento usado pelas pessoas de uma determinada região.
Preciso forçar qualquer operação relacionada ao horário para GMT / UTC
Para um deslocamento de zero horas-minutos-segundos, use a constante ZoneOffset.UTC
.
Instant
Para capturar o momento atual em UTC, use um Instant
. Esta classe representa um momento em UTC, sempre em UTC por definição.
Instant instant = Instant.now() ; // Capture current moment in UTC.
ZonedDateTime
Para ver esse mesmo momento através do relógio de parede usado pelas pessoas de uma determinada região, ajuste o fuso horário. Mesmo momento, mesmo ponto na linha do tempo, horário diferente do relógio de parede.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Base de dados
Você menciona um banco de dados.
Para recuperar um momento do banco de dados, sua coluna deve ser de um tipo de dados semelhante ao padrão SQL TIMESTAMP WITH TIME ZONE
. Recupere um objeto em vez de uma string. No JDBC 4.2 e posterior, podemos trocar objetos java.time com o banco de dados. O OffsetDateTime
é exigido pelo JDBC, enquanto Instant
& ZonedDateTime
são opcionais.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Na maioria dos bancos de dados e drivers, acho que você obterá o momento conforme visto no UTC. Mas se não, você pode ajustar de duas maneiras:
- Extraia um
Instant
: odt.toInstant()
- Ajuste do deslocamento fornecido para um deslocamento de zero: OffsetDateTime odtUtc = odt.withOffsetSameInstant (ZoneOffset.UTC); `.
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
Para saber mais, consulte o tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de cordas, não há necessidade de java.sql.*
classes.
Onde obter as classes java.time?