LocalDate à java.util.Date et vice versa conversion la plus simple? [dupliquer]


Cette question a déjà des réponses ici: Convertir java.temps.LocalDate dans java.util.Type de date (11 réponses) Fermé il y a 2 ans.

Existe-t-il un moyen simple de convertir un LocalDate (introduit avec Java 8) en java.util.Date objet?

Par "simple", je veux dire plus simple que cela:

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

Ce qui me semble un peu gênant.

Puisque nous ne nous intéressons qu'à la partie date et qu'il n'y a aucune information de fuseau horaire dans aucun des objets, pourquoi introduire explicitement des fuseaux horaires? L'heure de minuit et le fuseau horaire par défaut du système doivent être pris implicitement pour la conversion.

Author: Nathan Hughes, 2015-10-11

7 answers

En fait, il y en a. Il existe une méthode statique valueOf dans l'objet java.sql.Date qui fait exactement cela. Nous avons donc

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

Et c'est tout. Pas de réglage explicite des fuseaux horaires car le fuseau horaire local est pris implicitement.

De la documentation:

Le LocalDate fourni est interprété comme la date locale dans le local fuseau.

Le java.sql.Date sous-classes java.util.Date, alors le résultat est un java.util.Date aussi.

Et pour l'opération inverse il y a un toLocalDate méthode dans le java.SQL.Classe de date. Nous avons donc:

LocalDate ld = new java.sql.Date(date.getTime()).toLocalDate();

 136
Author: George, 2019-10-07 11:37:58

Tl; dr

Existe-t-il un moyen simple de convertir un LocalDate (introduit avec Java 8) en java.util.Objet date? Par "simple", je veux dire plus simple que cela

Non. Vous l'avez fait correctement et de manière aussi concise que possible.

java.util.Date.from(                     // Convert from modern java.time class to troublesome old legacy class.  DO NOT DO THIS unless you must, to inter operate with old code not yet updated for java.time.
    myLocalDate                          // `LocalDate` class represents a date-only, without time-of-day and without time zone nor offset-from-UTC. 
    .atStartOfDay(                       // Let java.time determine the first moment of the day on that date in that zone. Never assume the day starts at 00:00:00.
        ZoneId.of( "America/Montreal" )  // Specify time zone using proper name in `continent/region` format, never 3-4 letter pseudo-zones such as “PST”, “CST”, “IST”. 
    )                                    // Produce a `ZonedDateTime` object. 
    .toInstant()                         // Extract an `Instant` object, a moment always in UTC.
)

Lisez ci-dessous pour les problèmes, puis réfléchissez-y. Comment pourrait-il être plus simple? Si vous me demandez à quelle heure commence une date, sinon comment pourrais-je répondre mais vous demander " Où?"?. Un nouveau jour se lève plus tôt à Paris FR qu'à Montréal CA, et encore plus tôt à Calcutta, et même plus tôt à Auckland NZ, tous les moments différents.

, Donc dans la conversion d'une date uniquement (LocalDate) à une date-heure nous doit appliquer un fuseau horaire (ZoneId) pour obtenir un zonage de valeur (ZonedDateTime), et ensuite passer en UTC (Instant) pour correspondre à la définition de java.util.Date.

Détails

Tout d'abord, évitez les anciennes classes date-heure héritées telles que java.util.Date autant que possible. Ils sont mal conçus, déroutants et gênants. Ils ont été supplantés par les java.temps classes pour une raison, en fait, pour beaucoup de raisons.

Mais si vous le devez, vous pouvez convertir vers/depuis java.les types d'heures à l'ancienne. Recherchez de nouvelles méthodes de conversion ajoutées aux anciennes classes.

Tableau de tous les types date-heure en Java, modernes et hérités

java.util.Datejava.time.LocalDate

Gardez à l'esprit qu'un java.util.Date est un nom erroné car il représente une dateplus une heure de la journée, en UTC. En revanche, le LocalDate classe représente une valeur de date uniquement sans heure et sans heure zone.

Aller de java.util.Date à java.le temps signifie la conversion en la classe équivalente de java.time.Instant. L'Instant la classe représente un moment dans le scénario de UTC, avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).

Instant instant = myUtilDate.toInstant();

Le LocalDate la classe représente une valeur de date uniquement sans heure et sans fuseau horaire.

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie autour de le monde par zone. Par exemple, quelques minutes après minuit à Paris France est un nouveau jour alors qu'il était encore "hier" à Montréal Québec.

Nous devons donc déplacer ce Instant dans un fuseau horaire. Nous appliquons ZoneId pour obtenir un ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

À Partir de là, demandez une date uniquement, un LocalDate.

LocalDate ld = zdt.toLocalDate();

java.time.LocalDatejava.util.Date

Pour déplacer l'autre sens, à partir d'un java.time.LocalDate pour un java.util.Date signifie que nous allons partir d'une date uniquement à une date-heure. Nous devons donc spécifier une heure de la journée. Vous voudrez probablement aller pour le premier moment de la journée. Do pas suppose que c'est 00:00:00. Des anomalies telles que l'heure d'été (DST) signifient que le premier moment peut être une autre heure telle que 01:00:00. Laissez java.time détermine cette valeur en appelant atStartOfDay sur le LocalDate.

ZonedDateTime zdt = myLocalDate.atStartOfDay( z );

Maintenant, extrayez un Instant.

Instant instant = zdt.toInstant();

Convertir Instant à java.util.Date, en appelant from( Instant ).

java.util.Date d = java.util.Date.from( instant );

Plus d'infos


À propos de java.temps

Le java.temps framework est intégré à Java 8 et versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date-heure classes telles que java.util.Date, Calendar, & SimpleDateFormat.

Pour en savoir plus, voir le Tutoriel Oracle. Et rechercher Stack Overflow pour de nombreux exemples et des explications. La spécification est JSR 310.

Le Joda-Temps le projet, maintenant en mode de maintenance, conseille la migration vers le java.temps classes.

, Vous pouvez échanger java.temps objets directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de classes java.sql.*. Hibernate 5 & JPA 2.2 soutien java.temps.

Où pour obtenir le java.les classes de temps?

Table dont java.bibliothèque de temps à utiliser avec quelle version de Java ou Android

Le Trois-Extra le projet s'étend Java.temps avec des cours supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.temps. Vous pouvez trouver quelques classes utiles ici comme Interval, YearWeek, YearQuarter, et plus.

 132
Author: Basil Bourque, 2020-07-16 21:43:43

Date - > Date de localisation:

LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

Date locale - > Date:

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
 18
Author: Hai Nguyen, 2017-08-01 02:52:43

Conversion de LocalDateTime en java.util.Date

    LocalDateTime localDateTime = LocalDateTime.now();

    ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneOffset.systemDefault());

    Instant instant = zonedDateTime.toInstant();

    Date date = Date.from(instant);

System.out.println("Result Date is : "+date);
 3
Author: Simhadri, 2017-11-23 09:28:30

Date à localiser

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

Date de localisation à ce jour

LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
 3
Author: fjkjava, 2018-02-28 10:23:20

J'ai résolu cette question avec la solution ci-dessous

  import org.joda.time.LocalDate;
  Date myDate = new Date();
  LocalDate localDate = LocalDate.fromDateFields(myDate);
  System.out.println("My date using Date" Nov 18 11:23:33 BRST 2016);
  System.out.println("My date using joda.time LocalTime" 2016-11-18);

Dans ce cas, localDate imprime votre date dans ce format "aaaa-MM-jj"

 -2
Author: estevamdf, 2016-11-21 12:07:38

Vous pouvez convertir l'objet java.util.Date en un objet String, qui formatera la date en aaaa-mm-jj.

LocalDate a une méthode parse qui la convertira en un objet LocalDate. La chaîne doit représenter une date valide et est analysée à l'aide de DateTimeFormatter.ISO_LOCAL_DATE.

Date à localiser

LocalDate.parse(Date.toString())
 -4
Author: msvetterracer93, 2016-10-19 20:02:55