Konvertieren Sie java.time.LocalDate in den Typ java.util.Date

372

Ich möchte java.time.LocalDatein java.util.DateTyp konvertieren . Weil ich das Datum einstellen möchte JDateChooser. Oder gibt es eine Datumsauswahl, die java.timeDatumsangaben unterstützt ?

Kavinda Gehan
quelle
1
Haben Sie stackoverflow.com/questions/21242110/… gelesen ?
Daksh Shah
2
LGoodDatePicker verwendet nativ das Paket java.time (auch bekannt als Java 8 time oder JSR-310) . Insbesondere verwendet LGoodDatePicker ein "java.time.LocalDate" zum Speichern der Datumswerte. Screenshots und eine Demo befinden sich auf der Projekthomepage .
BlakeTNC
Weitere Antworten finden Sie unter: LocalDate to java.util.Date und umgekehrt einfachste Konvertierung?
Basil Bourque

Antworten:

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

JB Nizet
quelle
JB Nizet Vielleicht befand sich Java 8 in einem frühen Stadium der Entwicklung / Veröffentlichung und @ user3509494 testete es irgendwie.
Russellhoff
2
Ist es möglich zu vermeiden atStartOfDay(), da es den Wert des Datums ändert, wie ich es verstehe.
yegor256
1
@JBNizet Ihre Antwort macht für mich nicht viel Sinn, deshalb habe ich mich entschlossen zu klären. Warum klären Sie es nicht, anstatt nutzlose Kommentare abzugeben?
yegor256
12
Weil ich nicht sehe, wie und warum es einer Klärung bedarf. 232 Personen stimmten dieser Antwort zu und fanden sie klar. Sie sagen, atStartOfDay ändert den Wert des Datums. Das macht keinen Sinn. atStartOfDay macht das, was der Javadoc sagt: Es wandelt ein LocalDate am selben Tag und zu Beginn des Tages in eine LocalDateTime um.
JB Nizet
2
@cornz Bist du sicher, dass deine Ergebnisse falsch sind? Wenn Sie in Deutschland sind, dann könnte es etwas zu tun mit der 6 Minuten 32 Sekunden Glitch in der Zeit , in Deutschland, im April 1893. Siehe sein timeanddate.com/time/zone/germany/berlin?syear=1850 für einige Details .
Dawood ibn Kareem
104

Hier ist eine Utility-Klasse, mit der ich die neueren java.timeKlassen in java.util.DateObjekte 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.

Brice Roncace
quelle
Ist nicht 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?
Jhilden
94

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?

George
quelle
Dies war perfekt für mich, da ich LocalDate an SQL übergeben musste. Wenn Ihr Datumsformatierer jedoch vor dem Formatieren des Datums etwas gegen die Zeitzonenverschiebung unternimmt, wird der Tag je nach lokaler Zeitzone möglicherweise einen Tag zu früh angezeigt. In diesem Fall möchten Sie stattdessen eine der oben genannten Optionen.
Tom Dibble
7
java.sql.Dateist für die Datenbankschicht JDBC, JPA gedacht. Die Webebene (oder eine Clientanwendung) sollte absolut frei von jeglichen Abhängigkeiten sein java.sql.*.
Winzig
2
@Tiny java.sql.Date befindet sich in rt.jar. Es gibt keine externen Abhängigkeiten. Sie verwenden nur Sprachfunktionen.
George
2
java.sql.Dateist nur java.util.Datemit seiner Zeit eingestellt, 00:00:00aber 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.Dateauf der Java-Seite und java.sql.Timestampoder was auch immer java.sql.*auf der JDBC-Seite anwendbar ist .
Winzig
5
Dies ist laut java.time ein "schrecklicher Hack". * Autor: stackoverflow.com/questions/33066904/… . In Java 9 werden java.sql.*Klassen eine separate Abhängigkeit sein.
Dherik
16

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);
Kevin Sadler
quelle
12

Um ein java.util.Date aus einem java.time.LocalDate zu erstellen , müssen Sie

  • Fügen Sie dem LocalDate eine Zeit hinzu
  • Interpretieren Sie Datum und Uhrzeit innerhalb einer Zeitzone
  • Ermitteln Sie die Anzahl der Sekunden / Millisekunden seit der Epoche
  • Erstellen Sie ein java.util.Date

Der Code könnte wie folgt aussehen:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
nosid
quelle
1
Tippfehler in Zone ID (ZoneIf)
Assylias
localDate.atStartOfDay () erstellt eine ZonedDateTime, für ZonedDateTime gibt es jedoch keine toEpochSecond () -Methode.
Kevin Sadler
@ KevinSadler: Die Methode toEpochSecondwird von geerbt java.time.chrono.ChronoZonedDateTime. Siehe docs.oracle.com/javase/8/docs/api/java/time/chrono/…
nosid
@nosid Vielen Dank für Ihre Korrektur. Wenn ich die Code-Vervollständigung in Eclipse verwende, ist sie (und toInstance) nicht als Option vorhanden. Aber wenn ich es vollständig schreibe, scheint es akzeptiert zu werden. Ich war fälschlicherweise zu dem Schluss gekommen, dass es sich aufgrund dieser Tatsache nicht um eine Methode handelt und dass ich sie im Javadoc für ZonedDateTime nicht gesehen habe, da sie, wie Sie sagen, als geerbte Methode aufgeführt ist. Entschuldigung, bitte akzeptieren Sie einen Uplick :)
Kevin Sadler
11

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

ceklock
quelle
6
das ist ziemlich ineffizient
AndresQ
1
Das Konvertieren in Instant mag ausführlich sein, aber das
Erstellen
1
Ja, nicht so effizient, aber die meisten Lösungen sind sehr ausführlich. Dies ist nur ausführlich und leichter zu lesen und zu verstehen.
ceklock
2
@ehecatl Vorsicht ... in der Zukunft NY -> Tokio -> Mexiko-Stadt kann innerhalb einer Stunde (n) erledigt werden;)
Stephan
3

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()
Gyoder
quelle
11
Wie ist "Wechsel zu Kotlin" einfach? Dies ist eine Java-Frage.
Ehecatl
1
Das Konvertieren des Java LocalDate in Date ist ein häufiges, ärgerliches Problem für jeden JVM-Entwickler. Dies ist eine Lösung für Kotlin-Entwickler.
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());
} 
William Nguyen
quelle
2
Bitte erläutern Sie Ihre Lösung.
Martin Zabel
-2

Einfach

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
Artur Luiz Oliveira
quelle
-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
Mahendra Sri
quelle
Wie unterscheidet sich Ihre Antwort von der akzeptierten nach 4 Jahren? Kopieren-Einfügen, um die Reputation zu verbessern?
Stinger