web-dev-qa-db-fra.com

Comment convertir Java.sql.timestamp en LocalDate (Java8) Java.time?

Dans Java 8, comment puis-je convertir une Timestamp (dans Java.sql) en un LocalDate (dans Java.time)?

108
simonides

Tu peux faire:

timeStamp.toLocalDateTime().toLocalDate();
170
assylias

J'élargirai légèrement la réponse de @assylias pour prendre en compte le fuseau horaire. Il existe au moins deux méthodes pour obtenir LocalDateTime pour un fuseau horaire spécifique.

Vous pouvez utiliser le fuseau horaire setDefault pour toute l'application. Il doit être appelé avant tout horodatage -> Conversion Java.time:

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

Ou vous pouvez utiliser la chaîne toInstant.atZone:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
7
Pavel

La réponse acceptée n’est pas idéale, j’ai donc décidé d’ajouter mes 2 centimes

timeStamp.toLocalDateTime().toLocalDate();

c'est une mauvaise solution en général, je ne sais même pas pourquoi ils ont ajouté cette méthode au JDK car cela rend les choses vraiment déroutantes en effectuant une conversion implicite en utilisant le fuseau horaire du système. Habituellement, lorsqu'il utilise uniquement les classes de date Java8, le programmeur est obligé de spécifier un fuseau horaire, ce qui est une bonne chose.

La bonne solution est

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

zoneId est le fuseau horaire que vous souhaitez utiliser, généralement ZoneId.systemDefault () si vous souhaitez utiliser votre fuseau horaire système ou un fuseau horaire codé en dur, comme ZoneOffset .UTC

L’approche générale devrait être

  1. Libérez-vous des nouvelles classes de date Java8 en utilisant une classe directement liée, par exemple. dans notre cas Java.time.Instant est directement lié à Java.sql.Timestamp, c’est-à-dire qu’aucune conversion de fuseau horaire n’est nécessaire entre eux.
  2. Utilisez les méthodes bien conçues de cette classe Java8 pour faire le bon choix. Dans notre cas, atZone (zoneId) a clairement indiqué que nous procédions à une conversion et que nous utilisions un fuseau horaire particulier pour cette conversion.
5
Ruslan