Convertir java.time.LocalDate en type java.util.Date

373

Je veux convertir java.time.LocalDateen java.util.Datetype. Parce que je veux définir la date JDateChooser. Ou existe-t-il un sélecteur de date qui prend en charge les java.timedates?

Kavinda Gehan
la source
1
Avez-vous lu stackoverflow.com/questions/21242110/… ?
Daksh Shah
2
LGoodDatePicker utilise nativement le package java.time (alias Java 8 time, ou JSR-310 . Plus précisément, LGoodDatePicker utilise un "java.time.LocalDate" pour stocker les valeurs de date. Des captures d'écran et une démo se trouvent sur la page d'accueil du projet .
BlakeTNC
Plus de réponses peuvent être trouvées sur: LocalDate to java.util.Date et vice versa conversion la plus simple?
Basil Bourque

Réponses:

561
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

Cela suppose que votre sélecteur de date utilise le fuseau horaire par défaut du système pour transformer les dates en chaînes.

JB Nizet
la source
JB Nizet Java 8 était peut-être à un stade précoce de développement / sortie et @ user3509494 le testait d'une manière ou d'une autre.
russellhoff
2
Est-il possible d'éviter atStartOfDay(), car cela change la valeur de la date, si je comprends bien.
yegor256
1
@JBNizet votre réponse n'a pas beaucoup de sens pour moi, c'est pourquoi j'ai décidé de clarifier. Pourquoi ne le clarifiez-vous pas au lieu de faire des commentaires inutiles?
yegor256
12
Parce que je ne vois pas comment et pourquoi il faudrait une clarification. 232 personnes ont voté pour cette réponse, la trouvant ainsi claire. Vous dites atStartOfDay change la valeur de la date. Cela n'a aucun sens. atStartOfDay fait ce que le javadoc dit: il transforme un LocalDate en LocalDateTime, à la même date et au début de la journée.
JB Nizet
2
@cornz Êtes-vous sûr que vos résultats sont incorrects? Si vous êtes en Allemagne, cela pourrait être lié au problème de 6 minutes 32 secondes en Allemagne en avril 1893. Voir timeanddate.com/time/zone/germany/berlin?syear=1850 pour plus de détails. .
Dawood ibn Kareem
104

Voici une classe utilitaire que j'utilise pour convertir les nouvelles java.timeclasses en java.util.Dateobjets et vice versa:

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

Modifié sur la base du commentaire @Oliv.

Brice Roncace
la source
N'est pas ZoneId.systemDefault()problématique car les fuseaux horaires changent au cours de l'année. Donc, si le 1er janvier, je suis dans le fuseau horaire -05: 00 (central), mais le 1er juillet, je suis dans le fuseau horaire -06: 00 (lumière du jour centrale), cela ne provoquera pas de résultats inexacts en raison de l'heure d'été temps?
jhilden
95

Vous pouvez utiliser la java.sql.Date.valueOf()méthode comme:

Date date = java.sql.Date.valueOf(localDate);

Pas besoin d'ajouter ici les informations d'heure et de fuseau horaire car elles sont prises implicitement.
Voir LocalDate vers java.util.Date et vice versa la conversion la plus simple?

George
la source
C'était parfait pour moi, car ce dont j'avais besoin était de passer LocalDate en SQL. Cependant, si votre formateur de date va faire quelque chose à propos du décalage de fuseau horaire avant de formater la date, vous pouvez obtenir un jour trop tôt en fonction du fuseau horaire local, auquel cas vous voudrez plutôt l'une des options ci-dessus.
Tom Dibble
7
java.sql.Dateest destiné à la couche de base de données, JDBC, JPA. La couche Web (ou toute application client) doit absolument être exempte de toute dépendance java.sql.*.
Petit
2
@Tiny java.sql.Date réside dans rt.jar. Il n'y a aucune dépendance externe. Vous utilisez simplement les fonctionnalités linguistiques.
George
2
java.sql.Dateest juste java.util.Dateavec son temps défini, 00:00:00mais le point de vue de la conception est qu'il java.sql.*n'est pas destiné à une couche avant avec laquelle les clients interagissent comme Servlets / JSP. java.util.Datedans le côté Java et java.sql.Timestampou tout ce qui est applicable java.sql.*dans le côté JDBC .
Tiny
5
Il s'agit d'un "horrible piratage" selon java.time. * Auteur: stackoverflow.com/questions/33066904/… . En Java 9, les java.sql.*classes seront une dépendance distincte.
Dherik
16

java.time a l'interface temporelle que vous pouvez utiliser pour créer des objets instantanés à partir de la plupart des classes de temps. Instant représente les millisecondes sur la chronologie de l'époque - la référence de base pour toutes les autres dates et heures.

Nous devons convertir la date en un ZonedDateTime, avec une heure et une zone, pour effectuer la conversion:

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Kevin Sadler
la source
12

Pour créer un java.util.Date à partir d'un java.time.LocalDate , vous devez

  • ajouter une heure au LocalDate
  • interpréter la date et l'heure dans un fuseau horaire
  • obtenir le nombre de secondes / millisecondes depuis l' époque
  • créer un java.util.Date

Le code pourrait ressembler à ceci:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
nosid
la source
1
Typo in zone id (ZoneIf)
assylias
localDate.atStartOfDay () crée un ZonedDateTime, mais il n'y a pas de méthode toEpochSecond () pour ZonedDateTime.
Kevin Sadler
@KevinSadler: la méthode toEpochSecondest héritée de java.time.chrono.ChronoZonedDateTime. Voir docs.oracle.com/javase/8/docs/api/java/time/chrono/…
nosid
@nosid Merci pour votre correction. Lorsque j'utilise l'achèvement de code dans Eclipse, il (et toInstance) n'est pas présent en option. Mais si je le tape en entier, il semble être accepté. J'avais conclu à tort que ce n'était pas une méthode à cause de ce fait et que je ne l'ai pas vu sur le Javadoc pour ZonedDateTime, car il est répertorié comme une méthode héritée, comme vous le dites. Désolé, veuillez accepter un déclic :)
Kevin Sadler
11

Cela fonctionne pour moi:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--

ceklock
la source
6
c'est assez inefficace
AndresQ
1
La conversion en Instant peut être verbeuse, mais construire et analyser une chaîne, c'est comme aller de New York à Mexico via Tokyo ...
ehecatl
1
Oui, pas si efficace, mais la plupart des solutions sont très verbeuses. C'est juste verbeux et plus facile à lire et à comprendre.
ceklock
2
@ehecatl Attention ... dans le futur NY -> Tokyo -> Mexico peut se faire en quelques heures;)
Stephan
3

Solution Kotlin:

1) Collez cette fonction d'extension quelque part.

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2) Utilisez-le et ne revenez plus sur Google.

val myDate = myLocalDate.toDate()
gyoder
la source
11
En quoi le «passage à Kotlin» est-il simple? Ceci est une question Java.
ehecatl
2
La conversion de Java LocalDate en date est un problème courant et ennuyeux pour tout développeur JVM. Ceci est une solution pour les développeurs Kotlin.
gyoder
-1
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
    return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
} 
William Nguyen
la source
2
Veuillez expliquer votre solution.
Martin Zabel
-2

Facile

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
Artur Luiz Oliveira
la source
-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
Mahendra Sri
la source
en quoi votre réponse est différente de celle acceptée après 4 ans? Copiez-collez pour augmenter votre réputation?
stinger