Dans Java 8, comment puis-je convertir un Timestamp
(in java.sql
) en LocalDate
(in java.time
)?
Dans Java 8, comment puis-je convertir un Timestamp
(in java.sql
) en LocalDate
(in java.time
)?
Réponses:
Tu peux faire:
timeStamp.toLocalDateTime().toLocalDate();
Notez que vous
timestamp.toLocalDateTime()
utiliserez leClock.systemDefaultZone()
fuseau horaire pour effectuer la conversion. Cela peut ou non être ce que vous voulez.
timestamp.toLocalDateTime()
méthode utilisera le fuseau horaire systemDefault pour effectuer la conversion. Cela peut ou non être ce que vous voulez.
LocalDateTime
utilise toujours le fuseau horaire par défaut du système. C'est ce que signifie «Local» dans son nom.
La réponse acceptée n'est pas idéale, j'ai donc décidé d'ajouter mes 2 centimes
timeStamp.toLocalDateTime().toLocalDate();
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, lorsque vous n'utilisez que des 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()
Où zoneId est le fuseau horaire que vous souhaitez utiliser, qui est généralement soit 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
Je vais développer légèrement la réponse @assylias pour prendre en compte le fuseau horaire. Il existe au moins deux façons d'obtenir LocalDateTime pour un fuseau horaire spécifique.
Vous pouvez utiliser le fuseau horaire setDefault pour toute l'application. Il doit être appelé avant toute conversion d'horodatage -> 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();