Converter Data em LocalDate ou LocalDateTime e Voltar
1. Visão geral
A partir do Java 8, temos uma nova API de data -java.time.
No entanto, às vezes ainda precisamos realizar conversões entre as APIs novas e antigas e trabalhar com representações de data de ambas.
Leitura adicional:
Migrando para a nova API de data e hora do Java 8
Um guia rápido e prático sobre a transição para a nova API DateTime do Java 8.
Introdução à API Java 8 Date / Time
Neste artigo, examinaremos as novas APIs do Java 8 para Data e hora e quão mais fácil é construir e manipular datas e horas.
2. Convertendojava.util.Date emjava.time.LocalDate
Vamos começar convertendo a representação de data antiga para a nova.
Aqui, podemos tirar proveito de um novotoInstant() method which was added to java.util.Date em Java 8.
Quando estamos convertendo umInstantobject, it’s required to use a ZoneId, because _ _Instant objects are timezone-agnostic - apenas pontos na linha do tempo.
A APIatZone(ZoneId zone) do objetoInstant retorna umZonedDateTime–, portanto, precisamos apenas extrairLocalDate dele usando o métodotoLocalDate().
Em nosso primeiro exemplo aqui, estamos usando o sistema padrãoZoneId:
public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
A similar solution to the above one, but with a different way of creating an Instant object - usando o métodoofEpochMilli():
public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
Antes de prosseguirmos, vamos dar uma olhada rápida na classeold java.sql.Date e como isso pode ser convertido paraLocalDate também.
Começando com Java 8, podemos encontrar um métodotoLocalDate() adicional emjava.sql.Date - que também nos fornece uma maneira fácil de convertê-lo parajava.time.LocalDate.
Nesse caso, não precisamos nos preocupar com o fuso horário:
public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}
Da mesma forma, podemos converter o antigo objetoDate em um objetoLocalDateTime também - vamos dar uma olhada nisso a seguir.
3. Convertendojava.util.Date emjava.time.LocalDateTime
Para obter uma instânciaLocalDateTime - podemos usaran intermediary ZonedDateTime, and then using the toLocalDateTime() API da mesma forma.
Assim como antes, podemos usar duas soluções possíveis para obter um objetoInstant dejava.util.Date:
public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
E, começando com Java 8, também podemosuse java.sql.Timestamp to obtain a LocalDateTime:
ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
return new java.sql.Timestamp(
dateToConvert.getTime()).toLocalDateTime();
}
4. Convertajava.time.LocalDate emjava.util.Date
Agora que temos um bom entendimento de como converter a representação de dados antiga para a nova, vamos dar uma olhada na conversão na outra direção.
Discutiremos duas maneiras possíveis de converterLocalDate emDate.
No primeiro, usamos um novo objetovalueOf(LocalDate date) method provided injava.sql.Date que levaLocalDate como parâmetro:
public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
return java.sql.Date.valueOf(dateToConvert);
}
Como podemos ver, é fácil e intuitivo. Ele usa o fuso horário local para a conversão (tudo é feito sob o capô, não precisa se preocupar).
Em outro exemplo, Java 8, usamos um objetoInstant que passamos para o objetofrom(Instant instant)method ofjava.util.Date:
public Date convertToDateViaInstant(LocalDate dateToConvert) {
return java.util.Date.from(dateToConvert.atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant());
}
Você notará que usamos um objetoInstant aqui e que também precisamos nos preocupar com os fusos horários ao fazer essa conversão.
A seguir, vamos usar soluções muito semelhantes para converter um objetoLocalDateTime em um objetoDate.
5. Convertajava.time.LocalDateTime emjava.util.Date
A maneira mais fácil de obtera java.util.Date from LocalDateTime is to use an extension to thejava.sql.Timestamp - disponível com Java 8:
public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
return java.sql.Timestamp.valueOf(dateToConvert);
}
Mas, claro, uma solução alternativa é usaran Instant object – which we obtain from ZonedDateTime:
Date convertToDateViaInstant(LocalDateTime dateToConvert) {
return java.util.Date
.from(dateToConvert.atZone(ZoneId.systemDefault())
.toInstant());
}
6. Adições Java 9
No Java 9, existem novos métodos disponíveis que simplificam a conversão entrejava.util.Dateejava.time.LocalDate oujava.time.LocalDateTime.
LocalDate.ofInstant(Instant instant, ZoneId zone) eLocalDateTime.ofInstant(Instant instant, ZoneId zone) fornecem atalhos úteis:
public LocalDate convertToLocalDate(Date dateToConvert) {
return LocalDate.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
public LocalDateTime convertToLocalDateTime(Date dateToConvert) {
return LocalDateTime.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
7. Conclusão
Neste tutorial, cobrimos possíveis maneiras de converterjava.util.Date antigos em novosjava.time.LocalDateejava.time.LocalDateTimee outra maneira.
A implementação completa deste artigo está disponívelover on Github.