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?



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

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 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.


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?


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);

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);

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--


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()

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());
} 

2
Veuillez expliquer votre solution.
Martin Zabel

-2

Facile

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}

-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

en quoi votre réponse est différente de celle acceptée après 4 ans? Copiez-collez pour augmenter votre réputation?
stinger
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.