Converter Data em LocalDate ou LocalDateTime e Voltar

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.

Read more

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.

Read more

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.