Estou usando o JodaTime 1.6.2.
Eu tenho um LocalDate
que eu preciso converter para um (Joda) LocalDateTime
ou um java.sqlTimestamp
para ormapping.
A razão para isso é que eu descobri como converter entre a LocalDateTime
e a java.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Portanto, se eu puder apenas converter entre LocalDate
e LocalDateTime
, então eu posso fazer a conversão contínua para java.sql.Timestamp
. Obrigado por qualquer cutucada na direção certa!
java.sql.Timestamp
classe agora é herdada, substituída pelas classes java.time , especificamente porInstant
.Respostas:
JodaTime
Para converter JodaTime
org.joda.time.LocalDate
parajava.sql.Timestamp
, basta fazerPara converter JodaTime
org.joda.time.LocalDateTime
parajava.sql.Timestamp
, basta fazerJavaTime
Para converter Java8
java.time.LocalDate
parajava.sql.Timestamp
, basta fazerPara converter Java8
java.time.LocalDateTime
parajava.sql.Timestamp
, basta fazerfonte
LocalDateTime
paraDateTime
como nem todos osLocalDateTime
s são válidosDateTime
. Fonte: joda-time.sourceforge.net/faq.html#illegalinstant e apenas encontrando isso.Timestamp#valueOf()
método aceita, já que o Java SE 1.8 também aLocalDateTime
.A melhor maneira de usar a API do Java 8:
Para uso com o JPA inserido no seu modelo ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):
Portanto, agora é o tempo independente do fuso horário relativo. Além disso, é fácil fazer:
Formatação:
UPDATE: postgres 9.4.1208, HSQLDB 2.4.0 etc entendem a API do Java 8 Time sem nenhuma conversa!
fonte
tl; dr
O projeto Joda-Time está no modo de manutenção, agora substituído pelas classes java.time .
java.time.Instant
classe.LocalDateTime
java.sql.Timestamp
Capture o momento atual no UTC.
Para armazenar esse momento no banco de dados:
Para recuperar esse momento da base de dados:
Para ajustar a hora do relógio de parede com a de um fuso horário específico.
LocalDateTime
é a classe erradaOutras respostas estão corretas, mas não apontam que essa
LocalDateTime
é a classe errada para o seu propósito.No java.time e no Joda-Time , um
LocalDateTime
propositalmente não possui qualquer conceito de fuso horário ou deslocamento do UTC. Como tal, não representa um momento e não é um ponto na linha do tempo. ALocalDateTime
representa uma idéia aproximada de momentos em potencial ao longo de um período de 26 a 27 horas.Use a
LocalDateTime
para quando a zona / deslocamento for desconhecida (não é uma boa situação) ou quando o deslocamento da zona for indeterminado. Por exemplo, "O Natal começa no primeiro momento de 25 de dezembro de 2018" seria representado como aLocalDateTime
.Use a
ZonedDateTime
para representar um momento em um fuso horário específico. Por exemplo, o Natal começando em qualquer zona específica, comoPacific/Auckland
ouAmerica/Montreal
seria representada com umZonedDateTime
objeto.Por um momento sempre no UTC, use
Instant
.Aplique um fuso horário. Mesmo momento, mesmo ponto na linha do tempo, mas visualizado com uma hora diferente do relógio de parede.
Não, estratégia errada. Se você possui um valor somente de data e deseja um valor de data e hora, deve especificar uma hora do dia. Essa hora do dia pode não ser válida nessa data para uma zona específica - nesse caso, a
ZonedDateTime
classe ajusta automaticamente a hora do dia, conforme necessário.Se você deseja o primeiro momento do dia como sua hora do dia, deixe java.time determinar esse momento. Não assuma que o dia começa às 00:00:00. Anomalias como horário de verão (DST) significam que o dia pode começar em outro horário, como 01:00:00.
java.sql.Timestamp
é a classe erradaO
java.sql.Timestamp
faz parte dos incômodos aulas de data e hora de idade que estão agora legado, suplantaram inteiramente pelos java.time classes. Essa classe foi usada para representar um momento no UTC com uma resolução de nanossegundos . Esse propósito agora é servidojava.time.Instant
.JDBC 4.2 com
getObject
/setObject
A partir do JDBC 4.2 e posterior, seu driver JDBC pode trocar diretamente objetos java.time com o banco de dados chamando:
PreparedStatement::setObject
ResultSet::getObject
Por exemplo:
... e ...
Converter legado ⬌ moderno
Se você precisar interagir com o código antigo ainda não atualizado para java.time , converta-o usando os novos métodos adicionados às classes antigas.
…e…
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 as classes java.time .
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 de
java.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 .fonte
Dependendo do fuso horário, você pode perder alguns minutos (1650-01-01 00:00:00 passa a 1649-12-31 23:52:58)
Use o código a seguir para evitar que
fonte
Desde Joda é se desvaneceu, alguém pode querer converter
LocaltDate
aLocalDateTime
em Java 8. Em Java 8LocalDateTime
vai dar um jeito de criar umaLocalDateTime
instância usando umLocalDate
eLocalTime
. Confira aqui.A amostra seria,
Apenas para referência, para obter a época segundos abaixo pode ser usado,
fonte
LocalDateTime
tudo aqui. Essa classe propositalmente não possui qualquer conceito de fuso horário ou deslocamento do UTC. Portanto, não serve para nada aqui. Em vez disso:LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()
não assuma que o dia começa às 00:00, nem sempre é o caso.java.time.LocalDate.atStartOfDay
para obter aZonedDateTime
. Veja exemplos na minha resposta . Como comentei, aLocalDateTime
classe é inútil e contraproducente em tudo isso.LocalDateTime
devemos usar umZoneId
?LocalDateTime
é apropriado para o problema em questão aqui. Um não não representam um momento. A não tem nada a ver com nenhuma localidade ou fuso horário específico, embora o nome possa implicar à primeira vista - aprenda mais sobre a intenção e os detalhes dessa classe. A classe serve a um propósito, mas não ao objetivo visto nesta pergunta.LocalDateTime
LocalDateTime
LocalDateTime
chamada de função
asStartOfDay()
nojava.time.LocalDate
objeto retorna umjava.time.LocalDateTime
objetofonte
Java8 +
fonte