tl; dr
beraten die aktuellen "Best Practice" um Date
undCalendar
am besten ist es immer zu bevorzugen Calendar
überDate
Vermeiden Sie diese Legacy-Klassen vollständig. Verwenden Sie stattdessen java.time- Klassen.
- Verwenden Sie für einen Moment in UTC (das moderne Äquivalent von
Instant
Date
)
- Verwenden Sie für einen Moment in einer bestimmten Zeitzone (das moderne Äquivalent von )
ZonedDateTime
GregorianCalendar
- Verwenden Sie für einen Moment in einem bestimmten Versatz von UTC
OffsetDateTime
(kein Äquivalent in Legacy-Klassen).
- Verwenden Sie für eine Datums- und Uhrzeitangabe (keinen Moment) mit unbekannter Zeitzone oder Versatz (kein Äquivalent in Legacy-Klassen).
LocalDateTime
Einzelheiten
Die Antwort von Ortomala Lokni schlägt zu Recht vor, die modernen java.time- Klassen anstelle der problematischen alten alten Datums- / Uhrzeitklassen zu verwenden ( Date
,Calendar
usw.). Aber diese Antwort schlägt die falsche Klasse als gleichwertig vor (siehe meinen Kommentar zu dieser Antwort).
Mit java.time
Die java.time-Klassen sind eine enorme Verbesserung gegenüber den bisherigen Datums- und Uhrzeitklassen sowie dem Unterschied zwischen Tag und Nacht. Die alten Klassen sind schlecht gestaltet, verwirrend und mühsam. Sie sollten die alten Klassen nach Möglichkeit meiden. Wenn Sie jedoch in / aus dem alten / neuen konvertieren müssen, können Sie dies tun, indem Sie neue Methoden aufrufen, die dem alten hinzufügen Klassen werden.
Weitere Informationen zur Konvertierung finden Sie in meiner Antwort und in meinem übersichtlichen Diagramm zu einer anderen Frage: Konvertieren Sie java.util.Date in welchen Typ "java.time"?.
Searching Stack Overflow bietet viele hundert Beispielfragen und -antworten zur Verwendung von java.time. Aber hier ist eine kurze Zusammenfassung.
Instant
Holen Sie sich den aktuellen Moment mit einem Instant
. Die Instant
Klasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).
Instant instant = Instant.now();
ZonedDateTime
Wenden Sie eine Zeitzone ( ) an, um das gleiche simultane Moment durch die Linse der Wanduhrzeit einer bestimmten Region zu sehen .ZoneId
ZonedDateTime
Zeitzone
Geben Sie einen richtigen Zeitzonennamen im Format continent/region
, wie zum Beispiel America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben, wie z. B. EST
oder, IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Offset
Eine Zeitzone ist die Änderungshistorie einer Region in Bezug auf den Versatz von UTC . Aber manchmal erhalten Sie nur einen Versatz ohne die volle Zone. Verwenden Sie in diesem Fall die OffsetDateTime
Klasse.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
Die Verwendung einer Zeitzone ist der Verwendung eines bloßen Versatzes vorzuziehen.
LocalDateTime
Das "Lokal" in den Local…
Klassen bedeutet " beliebig" Ort, keinen bestimmten Ort. Der Name kann also kontraintuitiv sein.
LocalDateTime
, LocalDate
Und LocalTime
fehlen absichtlich keine Informationen über Offset- oder Zeitzone. Sie stellen also keine tatsächlichen Momente dar, sie sind keine Punkte auf der Zeitachse. Verwenden Sie im Zweifelsfall oder in der Verwirrung ZonedDateTime
eher alsLocalDateTime
. Search Stack Overflow für viel mehr Diskussion.
Saiten
Kombinieren Sie Datums- und Uhrzeitobjekte nicht mit Zeichenfolgen, die ihren Wert darstellen. Sie können eine Zeichenfolge analysieren, um ein Datums- / Uhrzeitobjekt abzurufen, und Sie können eine Zeichenfolge aus einem Datums- / Uhrzeitobjekt generieren. Die Zeichenfolge ist jedoch niemals die Datums- und Uhrzeit selbst.
Erfahren Sie mehr über die Standardformate ISO 8601 , die standardmäßig in den Klassen java.time verwendet werden.
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Wenn Sie einen JDBC-Treiber verwenden, der mit JDBC 4.2 oder höher kompatibel ist , können Sie java.time- Objekte direkt mit Ihrer Datenbank austauschen . Keine Notwendigkeit für Strings oder java.sql. * Klassen.
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .