Convertir java.temps.LocalDate dans java.util.Date type
Je veux convertir java.time.LocalDate
en java.util.Date
type. Parce que je veux définir la date dans JDateChooser
. Ou y a-t-il un sélecteur de date qui prend en charge java.time
rendez-vous?
11 answers
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Qui suppose que votre sélecteur de date utilise le fuseau horaire par défaut du système pour transformer les dates en chaînes.
Voici une classe utilitaire que j'utilise pour convertir les nouvelles classes java.time
en objets java.util.Date
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();
}
}
Édité sur la base du commentaire @Oliv.
Vous pouvez utiliser la méthode java.sql.Date.valueOf()
comme:
Date date = java.sql.Date.valueOf(localDate);
Pas besoin d'ajouter des informations sur l'heure et le fuseau horaire ici car elles sont prises implicitement.
Voir Localisation en java.util.Date et vice versa la conversion la plus simple?
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 timeline de l'époque - la référence de base pour toutes les autres dates et heures.
Nous devons convertir la date en 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);
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--
, afin de créer un java.util.Date à partir d'un java.temps.LocalDate , vous devez
- ajouter une heure au LocalDate
- interpréter la date et l'heure dans un fuseau horaire
- retourne le nombre de secondes / millisecondes depuis le époque
- créer un java.util.Date
Le code peut se présenter comme suit:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
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 google plus jamais cela.
val myDate = myLocalDate.toDate()
Alternativement, autre que la conversion du LocalDate
en un Instant
, on peut faire ceci:
new Date(localDate.toEpochDay() * DateUtils.MILLIS_PER_DAY);
Où DateUtils.MILLIS_PER_DAY
vient de commons-lang3
.
Ceci est sûrement aussi inexact que Date
lorsque des secondes intercalaires existent, ce qui est aussi la raison pour laquelle nous ne devrions plus utiliser java.util.Date
.
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());
}
Simple
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
Cette solution ici est un peu plus longue et vous pouvez également inclure quelque chose pour le moment ici, mais pour autant que je comprenne votre problème, vous avez juste besoin de la date réelle.
int day = this.datePicker2.getDate().getDayOfMonth();
int month = this.datePicker2.getDate().getMonthValue();
int year = this.datePicker2.getDate().getYear();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
calendar.set(Calendar.DATE, day);
Date date = calendar.getTime();
Peut ne pas avoir l'air aussi élégant mais cela fonctionne. Remarque: le mois-1 est utilisé car les mois du calendrier commencent par 0.