Ich möchte java.time.LocalDate
in java.util.Date
Typ konvertieren . Weil ich das Datum einstellen möchte JDateChooser
. Oder gibt es eine Datumsauswahl, die java.time
Datumsangaben unterstützt ?
Ich möchte java.time.LocalDate
in java.util.Date
Typ konvertieren . Weil ich das Datum einstellen möchte JDateChooser
. Oder gibt es eine Datumsauswahl, die java.time
Datumsangaben unterstützt ?
Antworten:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Dies setzt voraus, dass Ihre Datumsauswahl die Standardzeitzone des Systems verwendet, um Datumsangaben in Zeichenfolgen umzuwandeln.
atStartOfDay()
, da es den Wert des Datums ändert, wie ich es verstehe.
Hier ist eine Utility-Klasse, mit der ich die neueren java.time
Klassen in java.util.Date
Objekte konvertiere und umgekehrt:
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();
}
}
Bearbeitet basierend auf dem Kommentar von @Oliv.
ZoneId.systemDefault()
problematisch, da sich die Zeitzonen im Laufe des Jahres ändern. Wenn ich also am 01. Januar in der Zeitzone -05: 00 (zentral) bin, aber am 01. Juli in der Zeitzone -06: 00 (zentrales Tageslicht) bin, führt dies aufgrund der Sommerzeit nicht zu ungenauen Ergebnissen Zeit?
Sie können die java.sql.Date.valueOf()
Methode verwenden als:
Date date = java.sql.Date.valueOf(localDate);
Hier müssen keine Zeit- und Zeitzoneninformationen hinzugefügt werden, da diese implizit übernommen werden.
Siehe LocalDate zu java.util.Date und umgekehrt einfachste Konvertierung?
java.sql.Date
ist für die Datenbankschicht JDBC, JPA gedacht. Die Webebene (oder eine Clientanwendung) sollte absolut frei von jeglichen Abhängigkeiten sein java.sql.*
.
java.sql.Date
ist nur java.util.Date
mit seiner Zeit eingestellt, 00:00:00
aber der Punkt in der Designperspektive ist, dass java.sql.*
es nicht für eine vordere Ebene gedacht ist, mit der Clients wie Servlets / JSP interagieren. java.util.Date
auf der Java-Seite und java.sql.Timestamp
oder was auch immer java.sql.*
auf der JDBC-Seite anwendbar ist .
java.sql.*
Klassen eine separate Abhängigkeit sein.
java.time verfügt über die temporäre Schnittstelle, mit der Sie Instant-Objekte aus den meisten Zeitklassen erstellen können. Instant repräsentiert Millisekunden auf der Zeitachse in der Epoche - die Basisreferenz für alle anderen Daten und Zeiten.
Wir müssen das Datum in eine ZonedDateTime mit einer Uhrzeit und einer Zone konvertieren, um die Konvertierung durchzuführen:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Um ein java.util.Date aus einem java.time.LocalDate zu erstellen , müssen Sie
Der Code könnte wie folgt aussehen:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
wird von geerbt java.time.chrono.ChronoZonedDateTime
. Siehe docs.oracle.com/javase/8/docs/api/java/time/chrono/…
Das funktioniert bei mir:
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--
Kotlin-Lösung:
1) Fügen Sie diese Erweiterungsfunktion irgendwo ein.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Verwenden Sie es und googeln Sie es nie wieder.
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());
}
Einfach
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());