java.time
A abordagem moderna usa as classes java.time que suplantaram as classes legadas e problemáticas de data e hora agrupadas com as primeiras versões do Java.
A java.sql.Timestamp
classe é uma daquelas classes legadas. Não é mais necessário. Em vez disso, use Instant
ou outras classes java.time diretamente com seu banco de dados usando JDBC 4.2 e posterior.
A Instant
classe representa um momento na linha do tempo em UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Se você precisar interoperar com um existente Timestamp
, converta imediatamente em java.time por meio dos novos métodos de conversão adicionados às classes antigas.
Instant instant = myTimestamp.toInstant() ;
Para ajustar em outro fuso horário, especifique o fuso horário como um ZoneId
objeto. Especifique um nome próprio fuso horário no formato continent/region
, como America/Montreal
, Africa/Casablanca
, ou Pacific/Auckland
. Nunca use os pseudo-fusos de 3-4 letras, como EST
ou IST
porque eles não são fusos horários verdadeiros, não padronizados e nem mesmo únicos (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Aplicar ao Instant
para produzir um ZonedDateTime
objeto.
ZonedDateTime zdt = instant.atZone( z ) ;
Para gerar uma string para exibir ao usuário, pesquise Stack Overflow para DateTimeFormatter
encontrar muitas discussões e exemplos.
Sua pergunta é realmente sobre ir na outra direção, da entrada de dados do usuário aos objetos de data e hora. Geralmente é melhor dividir a entrada de dados em duas partes, uma data e uma hora do dia.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Sua pergunta não está clara. Você quer interpretar a data e a hora inseridas pelo usuário como sendo UTC? Ou em outro fuso horário?
Se você quis dizer UTC, crie um OffsetDateTime
com um deslocamento usando a constante para UTC ZoneOffset.UTC
,.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Se você quis dizer outro fuso horário, combine junto com um objeto de fuso horário, a ZoneId
. Mas qual fuso horário? Você pode detectar um fuso horário padrão. Ou, se for crítico, você deve confirmar com o usuário para ter certeza de sua intenção.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Para obter um objeto mais simples que está sempre em UTC por definição, extraia um Instant
.
Instant instant = odt.toInstant() ;
…ou…
Instant instant = zdt.toInstant() ;
Envie para seu banco de dados.
myPreparedStatement.setObject( … , instant ) ;
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
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Onde obter as classes java.time?
- Java SE 8 , Java SE 9 e posterior
- Construídas em.
- Parte da API Java padrão com uma implementação agrupada.
- Java 9 adiciona alguns recursos e correções menores.
- Java SE 6 e Java SE 7
- Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
- Android
- Versões posteriores de implementações de pacotes Android das classes java.time.
- Para anteriormente Android, o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .