Como converter java.sql.timestamp para LocalDate (java8) java.time?


Respostas:


196

Você pode fazer:

timeStamp.toLocalDateTime().toLocalDate();

Observe que timestamp.toLocalDateTime() usará o Clock.systemDefaultZone()fuso horário para fazer a conversão. Isso pode ou não ser o que você deseja.


1
Foi adicionado no Java 8.
assylias

54
Apenas uma observação, o timestamp.toLocalDateTime()método usará o fuso horário systemDefault para fazer a conversão. Isso pode ou não ser o que você deseja.
usar o seguinte código

1
@jacobhyphenated, poste a resposta usando um fuso horário explícito. Obrigado!
user482745

O comentário de @ jacobhyphenated é extremamente importante aqui, daí o número de votos positivos para ele. Veja minha resposta para obter detalhes stackoverflow.com/a/57101544/2032701
Ruslan

@jacobhyphenated, LocalDateTimesempre usa o fuso horário padrão do sistema. Isso é o que "Local" significa em seu nome.
Prokhorov

20

A resposta aceita não é ideal, então decidi adicionar meus 2 centavos

timeStamp.toLocalDateTime().toLocalDate();

é uma solução ruim em geral , nem sei ao certo por que eles adicionaram esse método ao JDK, pois isso torna as coisas realmente confusas ao fazer uma conversão implícita usando o fuso horário do sistema. Geralmente, ao usar apenas classes java8 date, o programador é forçado a especificar um fuso horário, o que é uma coisa boa.

A boa solução é

timestamp.toInstant().atZone(zoneId).toLocalDate()

Onde zoneId é o fuso horário que você deseja usar, que normalmente é ZoneId.systemDefault () se você deseja usar o fuso horário do sistema ou algum fuso horário codificado como ZoneOffset.UTC

A abordagem geral deve ser

  1. Liberte-se para as novas classes java8 date usando uma classe diretamente relacionada, por exemplo, no nosso caso, java.time.Instant está diretamente relacionado ao java.sql.Timestamp , ou seja, nenhuma conversão de fuso horário é necessária entre elas.
  2. Use os métodos bem projetados nesta classe java8 para fazer a coisa certa. No nosso caso, atZone (zoneId) deixou explícito que estamos fazendo uma conversão e usando um fuso horário específico.

1
Discordo. O registro de data e hora (e também a data) não possui nenhuma informação de zona. LocalDate não possui nenhuma informação de zona, portanto os dois são equivalentes. A conversão entre eles pode ser feita independentemente de qualquer zona específica. Converter para um ZonedDateTime antes de converter para LocalDate adiciona um fuso horário e o retira novamente - é muito mais provável que você tenha um erro desagradável - difícil de encontrar - fazendo dessa maneira.
AutomatedMike

5
O carimbo de data / hora do @AutomatedMike (e também a data) representam um ponto no tempo no UTC. LocalDate não representa um ponto no tempo, mas um tempo como visto em um relógio de parede. Por favor, leia seus javadocs. "A conversão entre eles pode ser feita independentemente de qualquer zona específica" - não é verdade , o novo carimbo de data / hora (0L) .toLocalDateTime () retorna "1970-01-01T03: 00" para o meu fuso horário de Moscou. O resultado pode ser diferente para o seu fuso horário.
Ruslan

1
@AutomatedMike Mesmo que você diminua o tempo executando toLocalDate (), é fácil provar que o dia pode estar errado se o Timestamp tiver um horário por volta da meia-noite, por exemplo, o novo Timestamp (1000 * 60 * 60 * 23) .toLocalDateTime (). ToLocalDate () retorna "1970-01-02" para o meu fuso horário de Moscou quando é "1970-01-01" no UTC.
Ruslan

1
@AutomatedMike "adiciona um fuso horário e depois o retira" - o ponto não é adicionar e remover um fuso horário, mas converter entre noções diferentes usando um fuso horário explícito . Isso contrasta com os exemplos dos meus dois comentários anteriores, nos quais um fuso horário é aplicado implicitamente .
Ruslan

7

Expandirei levemente a resposta do @assylias para levar em conta o fuso horário. Há pelo menos duas maneiras de obter LocalDateTime para um fuso horário específico.

Você pode usar o fuso horário setDefault para todo o aplicativo. Ele deve ser chamado antes de qualquer registro de data e hora -> java.time:

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

Ou você pode usar a cadeia toInstant.atZone:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.