wake-up-neo.com

LocalDate zu Java.util.Date und umgekehrt einfachste Konvertierung?

Gibt es eine einfache Möglichkeit, ein mit Java 8 eingeführtes LocalDate in ein Java.util.Date-Objekt zu konvertieren? 

Mit "einfach" meine ich einfacher als dieses: 

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

das erscheint mir etwas unbeholfen. 

Da wir uns nur für den Datumsteil interessieren und es in keinem der Objekte keine Zeitzoneninformationen gibt, warum sollten Zeitzonen explizit eingeführt werden? Die Mitternachtzeit und die Standardzeitzone des Systems sollten implizit für die Konvertierung verwendet werden.

98
George

Eigentlich gibt es. Es gibt eine statische Methode valueOf im Objekt Java.sql.Date, Die genau das tut. Also haben wir

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

und das ist es. Keine explizite Einstellung von Zeitzonen, da die lokale Zeitzone implizit verwendet wird.

Aus Dokumenten:

Das angegebene LocalDate wird als lokales Datum in der lokalen Zeitzone interpretiert.

Die Java.sql.Date - Unterklassen Java.util.Date, So dass das Ergebnis auch Java.util.Date Ist.

Für den umgekehrten Vorgang gibt es eine toLocalDate - Methode in der Java.sql.Date-Klasse. Also haben wir:

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

118
George

tl; dr

Gibt es eine einfache Möglichkeit, ein LocalDate (eingeführt mit Java 8)) in ein Java.util.Date-Objekt zu konvertieren?

Nee. Sie haben es richtig und so kurz wie möglich gemacht.

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

Lesen Sie weiter unten nach, und denken Sie dann darüber nach. Wie könnte es einfacher sein? Wenn Sie mich fragen, wann ein Datum beginnt, wie könnte ich dann antworten, ohne Sie zu fragen, wo? In Paris FR bricht früher ein neuer Tag an als in Montréal CA, und noch früher in Kolkata IN und noch früher in Auckland NZ, alles andere als je zuvor.

Wenn Sie also ein reines Datum (LocalDate) in eine Datumszeit umwandeln, müssen Sieeine Zeitzone (ZoneId) anwenden, um einen Zonenwert (ZonedDateTime) zu erhalten ] _) und dann in UTC (Instant) verschieben, um der Definition von Java.util.Date zu entsprechen.

Einzelheiten

Vermeiden Sie zunächst die alten Datums- und Zeitklassen wie Java.util.Date, Wann immer dies möglich ist. Sie sind schlecht gestaltet, verwirrend und lästig. Sie wurden aus einem bestimmten Grund von den Java.time-Klassen verdrängt, und zwar aus vielen Gründen.

Aber wenn Sie müssen, können Sie zu/von Java.time-Typen zu den alten konvertieren. Suchen Sie nach neuen Konvertierungsmethoden, die den alten Klassen hinzugefügt wurden.

Java.util.DateJava.time.LocalDate

Denken Sie daran, dass ein Java.util.Date Eine falsche Bezeichnung ist, da es ein Datum plus eine Uhrzeit in UTC darstellt. Im Gegensatz dazu steht die Klasse LocalDate für einen Nur-Datum-Wert ohne Uhrzeit und ohne Zeitzone.

Wenn Sie von Java.util.Date Zu Java.time wechseln, müssen Sie in die entsprechende Klasse von Java.time.Instant Konvertieren. Die Klasse Instant repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden ( bis zu neun (9) Stellen eines Dezimalbruchs).

Instant instant = myUtilDate.toInstant();

Die Klasse LocalDate repräsentiert einen Datumswert ohne Uhrzeit und ohne Zeitzone.

Eine Zeitzone ist für die Bestimmung eines Datums von entscheidender Bedeutung. Für jeden Moment variiert das Datum weltweit je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während noch „gestern“ in Montréal Québec .

Also müssen wir dieses Instant in eine Zeitzone verschieben. Wir wenden ZoneId an, um ZonedDateTime zu erhalten.

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

Fragen Sie von dort nach einem Datum, einem LocalDate.

LocalDate ld = zdt.toLocalDate();

Java.time.LocalDateJava.util.Date

Um die andere Richtung zu wechseln, von einem Java.time.LocalDate Zu einem Java.util.Date, Müssen wir von einem reinen Datum zu einer Datumszeit wechseln. Wir müssen also eine Tageszeit angeben. Sie möchten wahrscheinlich für den ersten Moment des Tages gehen. Nehmen Sie an, dass nicht 00:00:00 Ist. Anomalien wie die Sommerzeit (DST) bedeuten, dass der erste Moment möglicherweise eine andere Zeit ist, z. B. 01:00:00. Lassen Sie Java.time diesen Wert bestimmen, indem Sie atStartOfDay für LocalDate aufrufen.

ZonedDateTime zdt = myLocalDate.atStartOfDay( z );

Extrahieren Sie nun ein Instant.

Instant instant = zdt.toInstant();

Konvertieren Sie diesen Instant in Java.util.Date, Indem Sie from( Instant ) aufrufen.

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

Mehr Info

Table of date-time types in Java, both legacy and modern.


Über Java.time

Das Framework Java.time ist in Java 8 und höher. Diese Klassen ersetzen die lästige alte Legacy -Datum-Zeit Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Projekt Joda-Time , das sich jetzt im Wartungsmodus befindet, empfiehlt die Migration zu den Klassen Java.time .

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Die Spezifikation lautet JSR 31 .

Sie können Java.time Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber , der mit JDBC 4.2 oder höher kompatibel ist. Keine Notwendigkeit für Zeichenketten, keine Notwendigkeit für Klassen Java.sql.*.

Woher bekommen Sie die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und Mehr .

80
Basil Bourque

Date -> LocalDate:

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

LocalDate -> Datum:

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

Datum zu LocalDate

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

LocalDate bis Datum

LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
2
fjkjava

Konvertieren von LocalDateTime nach 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);
0
Simhadri