390 Stimmen

Java Datum vs. Kalender

Könnte bitte jemand die derzeitige "beste Praxis" in Bezug auf Date y Calendar Typen.

Ist es am besten, beim Schreiben von neuem Code immer die Calendar über Date oder gibt es Umstände, unter denen Date der geeignetere Datentyp ist?

385voto

cletus Punkte 596503

Date ist eine einfachere Klasse und wird hauptsächlich aus Gründen der Abwärtskompatibilität verwendet. Wenn Sie ein bestimmtes Datum festlegen oder eine Datumsarithmetik durchführen müssen, verwenden Sie einen Kalender. Calendars übernehmen auch die Lokalisierung. Die früheren Datumsmanipulationsfunktionen von Date sind inzwischen veraltet.

Ich persönlich neige dazu, entweder die Zeit in Millisekunden als Long (oder Long, je nachdem) oder Calendar zu verwenden, wenn es eine Wahlmöglichkeit gibt.

Sowohl Datum als auch Kalender sind veränderbar, was bei der Verwendung in einer API zu Problemen führen kann.

66voto

dmeister Punkte 33302

Der beste Weg für neuen Code (wenn Ihre Richtlinie Code von Drittanbietern zulässt) ist die Verwendung der Joda Time Bibliothek .

Beides, Datum y Kalender haben so viele Designprobleme, dass beide keine guten Lösungen für neuen Code sind.

60voto

oxbow_lakes Punkte 131223
  • Date y Calendar sind eigentlich dasselbe Grundkonzept (beide stellen eine zeitlicher Augenblick und sind Umhüllungen für eine zugrunde liegende long Wert).

  • Man könnte argumentieren, dass Calendar ist sogar noch kaputter als Date ist, da es anscheinend konkrete Fakten über Dinge wie Wochentag und Tageszeit bietet, während es bei einer Änderung seiner timeZone Eigentum, wird der Beton zu Pudding! Beide Objekte sind nicht wirklich nützlich als Speicher von Jahr-Monat-Tag ou Tageszeit aus diesem Grund.

  • Utilisez Calendar nur als Taschenrechner, der, wenn er Date y TimeZone Objekte, werden Berechnungen für Sie durchführen. Vermeiden Sie seine Verwendung für die Eingabe von Eigenschaften in einer Anwendung.

  • Utilisez SimpleDateFormat zusammen mit TimeZone y Date um Display Strings zu erzeugen.

  • Wenn Sie abenteuerlustig sind, verwenden Sie Joda-Time, obwohl es unnötig kompliziert ist IMHO und ist bald durch die JSR-310 Datum API in jedem Fall überholt werden.

  • Ich habe schon einmal geantwortet, dass es nicht schwierig ist, seine eigene Rolle zu spielen. YearMonthDay Klasse, die die Calendar unter der Haube für Datumsberechnungen. Ich wurde für den Vorschlag heruntergestuft, aber ich glaube immer noch, dass es ein gültiger Vorschlag ist, weil Joda-Time (und JSR-310 ) sind für die meisten Anwendungsfälle wirklich zu kompliziert.

40voto

Basil Bourque Punkte 256611

Tl;dr

die derzeitige "beste Praxis" zu empfehlen Date y Calendar

ist es am besten, immer zu bevorzugen Calendar über Date

Vermeiden Sie diese alten Klassen vollständig. Verwenden Sie java.time Klassen statt.

  • Für einen Moment in UTC verwenden Instant
    (die moderne Entsprechung von Date )
  • Für einen Moment in einer bestimmten Zeitzone verwenden ZonedDateTime
    (die moderne Entsprechung von GregorianCalendar )
  • Für einen Moment in einer bestimmten Abweichung von der UTC verwenden OffsetDateTime
    (keine Entsprechung in alten Klassen)
  • Für einen Datumszeitpunkt (nicht einen Zeitpunkt) mit unbekannter Zeitzone oder Zeitverschiebung verwenden Sie LocalDateTime
    (keine Entsprechung in alten Klassen)

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

Einzelheiten

Le site Antwort von Ortomala Lokni hat Recht, wenn er vorschlägt, die moderne java.time Klassen anstelle der lästigen alten Datum-Zeit-Klassen ( Date , Calendar , usw.). Aber diese Antwort schlägt die falsche Klasse als gleichwertig vor (siehe meinen Kommentar zu dieser Antwort).

Verwendung von java.time

Die java.time-Klassen sind eine . Verbesserung gegenüber den alten Datum-Zeit-Klassen, ein Unterschied wie Tag und Nacht. Die alten Klassen sind schlecht durchdacht, verwirrend und lästig. Wann immer möglich, sollten Sie die alten Klassen vermeiden. Wenn Sie jedoch von/nach den alten/neuen Klassen konvertieren müssen, können Sie dies tun, indem Sie neue Methoden aufrufen, die der alt Klassen.

Weitere Informationen zur Umstellung finden Sie unter meine Antwort und ein hübsches Diagramm zu einer anderen Frage, java.util.Date in welchen "java.time"-Typ konvertieren? .

Die Suche auf Stack Overflow liefert viele Hunderte von Beispielfragen und Antworten zur Verwendung von java.time. Aber hier ist eine kurze Zusammenfassung.

Instant

Holen Sie sich den aktuellen Zeitpunkt mit einer Instant . Die Instant Klasse stellt einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern eines Dezimalbruchs).

Instant instant = Instant.now();

ZonedDateTime

Um zu sehen, dass Gleichzeitiger Zeitpunkt durch die Brille einer bestimmten Region zu sehen Wanduhrzeit eine Zeitzone anwenden ( ZoneId ), um eine ZonedDateTime .

Zeitzone

Geben Sie eine Name der richtigen Zeitzone im Format von continent/region , wie zum Beispiel America/Montreal , Africa/Casablanca ou Pacific/Auckland . Verwenden Sie niemals eine Abkürzung mit 3-4 Buchstaben wie z. B. EST ou IST wie sie sind no echte Zeitzonen, nicht standardisiert und nicht einmal eindeutig(!).

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

Versetzt

Eine Zeitzone ist die Geschichte der Veränderungen einer Region in ihrer Abweichung von der UTC . Manchmal wird jedoch nur ein Offset ohne die gesamte Zone angegeben. In diesem Fall verwenden Sie die OffsetDateTime Klasse.

ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );

Die Verwendung einer Zeitzone ist der Verwendung eines bloßen Offsets vorzuziehen.

LocalDateTime

Das "Lokal" in der Local… Klassen bedeutet jede Ortschaft, nicht eine bestimmte Ortschaft. Der Name kann also kontra-intuitiv sein.

LocalDateTime , LocalDate そして LocalTime absichtlich keine Informationen über Offset oder Zeitzone enthalten. Sie tun also no tatsächliche Momente darstellen, sind sie no Punkte auf der Zeitachse. Im Zweifelsfall oder bei Verwirrung, verwenden Sie ZonedDateTime よりも LocalDateTime . Suchen Sie Stack Overflow für viel mehr Diskussion.

Streicher

Verwechseln Sie nicht Datum-Zeit-Objekte mit Zeichenketten, die deren Wert darstellen. Sie können eine Zeichenkette parsen, um ein Datum-Zeit-Objekt zu erhalten, und Sie können eine Zeichenkette aus einem Datum-Zeit-Objekt erzeugen. Aber die Zeichenkette ist niemals die Datumszeit selbst.

Erfahren Sie mehr über Standard ISO 8601 Formate, die standardmäßig in den java.time-Klassen verwendet werden.


Über java.time

Le site java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date , Calendar , & SimpleDateFormat .

Le site Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

Weitere Informationen finden Sie in der Oracle-Tutorial . Auf Stack Overflow finden Sie viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .

Mit einer JDBC-Treiber übereinstimmend mit JDBC 4.2 oder später, können Sie umtauschen java.time Objekte direkt mit Ihrer Datenbank. Sie brauchen weder Strings noch java.sql.*-Klassen.

Wo erhält man die java.time-Klassen?

  • Java SE 8 , Java SE 9 und später
    • Eingebaut.
    • Teil der Standard-Java-API mit einer gebündelten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 y Java SE 7
    • Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert in DreiZehn-Backport .
  • Android
    • Spätere Versionen von Android bündeln Implementierungen der java.time-Klassen.
    • Bei früheren Android-Versionen ist die DreiZehnABP Projekt passt sich an DreiZehn-Backport (siehe oben). Siehe Wie benutzt man ThreeTenABP .

Table of which java.time library to use with which version of Java or Android

Le site DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie finden hier vielleicht einige nützliche Klassen wie Interval , YearWeek , YearQuarter そして mehr .

26voto

KLE Punkte 22895

Date eignet sich am besten für die Speicherung eines Datumsobjekts. Es ist das persistierte, das serialisierte ...

Der Kalender eignet sich am besten für die Bearbeitung von Daten.

Hinweis: Wir bevorzugen manchmal auch java.lang.Long gegenüber Date, da Date veränderbar und daher nicht thread-sicher ist. Bei einem Date-Objekt verwenden Sie setTime() und getTime(), um zwischen den beiden zu wechseln. Zum Beispiel ein konstantes Date in der Anwendung (Beispiele: die Null 1970/01/01, oder ein applikatives END_OF_TIME, das Sie auf 2099/12/31 setzen; diese sind sehr nützlich, um Nullwerte als Start- und Endzeit zu ersetzen, besonders wenn Sie sie in der Datenbank persistieren, da SQL so eigenartig mit Nullen umgeht).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X