tl; dr
Use apenas classes java.time modernas . Nunca use os terríveis aulas legados, como SimpleDateFormat
, Date
, ou 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`.
Ou use o fuso horário padrão atual da JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time e JDBC 4.2
A abordagem moderna usa o java.time classes , como visto acima.
Se o seu driver JDBC estiver em conformidade com o JDBC 4.2 , você poderá trocar diretamente objetos java.time com o banco de dados. Use PreparedStatement::setObject
eResultSet::getObject
.
Use java.sql apenas para drivers anteriores ao JDBC 4.2
Se o driver JDBC ainda não estiver em conformidade com o JDBC 4.2 para suporte ao java.time tipos , você deverá voltar a usar as classes java.sql.
Armazenando dados.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Recuperando dados.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Os tipos java.sql, como java.sql.Timestamp
, devem ser usados apenas para transferir dentro e fora do banco de dados. Converta imediatamente para tipos java.time no Java 8 e posterior.
java.time.Instant
Um java.sql.Timestamp
mapeia para a java.time.Instant
, um momento na linha do tempo no UTC. Observe o novo método de conversão toInstant
adicionado à classe antiga.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Fuso horário
Aplique o fuso horário desejado / esperado ( ZoneId
) para obter a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Strings formatadas
Use a DateTimeFormatter
para gerar sua string. Os códigos de padrão são semelhantes aos de, java.text.SimpleDateFormat
mas não exatamente, portanto, leia o documento com atenção.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Esse formato específico é ambíguo quanto ao seu significado exato, pois não possui nenhuma indicação de deslocamento do UTC ou fuso horário.
ISO 8601
Se você tem alguma opinião sobre o assunto, sugiro que você considere usar os formatos padrão ISO 8601 em vez de criar seus próprios. O formato padrão é bastante semelhante ao seu. Por exemplo:
2016-02-20T03:26:32+05:30
.
As classes java.time usam esses formatos padrão por padrão, portanto, não é necessário especificar um padrão. A ZonedDateTime
classe estende o formato padrão acrescentando o nome do fuso horário (uma melhoria sábia).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Converta em java.sql
Você pode converter de java.time de volta para java.sql.Timestamp
. Extraia um Instant
doZonedDateTime
.
Novos métodos foram adicionados às classes antigas para facilitar a conversão de / para as classes java.time.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
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
, eSimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para o java.time classes .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
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 strings, não há necessidade dejava.sql.*
classes.
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .