Je veux convertir java.time.LocalDate
en java.util.Date
type. Parce que je veux définir la date JDateChooser
. Ou existe-t-il un sélecteur de date qui prend en charge les java.time
dates?
Je veux convertir java.time.LocalDate
en java.util.Date
type. Parce que je veux définir la date JDateChooser
. Ou existe-t-il un sélecteur de date qui prend en charge les java.time
dates?
Réponses:
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.
atStartOfDay()
, car cela change la valeur de la date, si je comprends bien.
Voici une classe utilitaire que j'utilise pour convertir les nouvelles java.time
classes en java.util.Date
objets 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.
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?
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?
java.sql.Date
est 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.*
.
java.sql.Date
est juste java.util.Date
avec son temps défini, 00:00:00
mais 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.Date
dans le côté Java et java.sql.Timestamp
ou tout ce qui est applicable java.sql.*
dans le côté JDBC .
java.sql.*
classes seront une dépendance distincte.
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);
Pour créer un java.util.Date à partir d'un java.time.LocalDate , vous devez
Le code pourrait ressembler à ceci:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
est héritée de java.time.chrono.ChronoZonedDateTime
. Voir docs.oracle.com/javase/8/docs/api/java/time/chrono/…
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--
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()
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());
}
Facile
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());