Ich komme aus der C # -Welt, habe also noch keine allzu großen Erfahrungen mit Java. Mir wurde gerade von Eclipse gesagt, dass dies Date
veraltet sei:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
Warum? Und was (besonders in Fällen wie oben) sollte stattdessen verwendet werden?
java
date
deprecated
Svish
quelle
quelle
Antworten:
Der spezifische
Date
Konstruktor ist veraltet undCalendar
sollte stattdessen verwendet werden. DasJavaDoc
for- Datum beschreibt, welche Konstruktoren veraltet sind und wie sie durch a ersetzt werden könnenCalendar
.quelle
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .Die
java.util.Date
Klasse ist nicht wirklich veraltet, nur dieser Konstruktor und einige andere Konstruktoren / Methoden sind veraltet. Es wurde abgelehnt, weil diese Art der Nutzung bei der Internationalisierung nicht gut funktioniert. DieCalendar
Klasse sollte stattdessen verwendet werden:Schauen Sie sich das Datum Javadoc an:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
quelle
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
Klassen die bessere Option ... wenn Sie Ihren Code ändern.tl; dr
…oder…
Einzelheiten
Die
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
Klassen waren zu schnell gehetzt , wenn Java zum ersten Mal gestartet und weiterentwickelt. Die Klassen waren nicht gut gestaltet oder implementiert. Es wurden Verbesserungen versucht, daher die von Ihnen gefundenen Abwertungen. Leider sind die Verbesserungsversuche weitgehend gescheitert. Sie sollten diese Klassen insgesamt vermeiden . Sie werden in Java 8 durch neue Klassen ersetzt.Probleme in Ihrem Code
Ein java.util.Date hat sowohl einen Datums- als auch einen Zeitabschnitt. Sie haben den Zeitanteil in Ihrem Code ignoriert. Die Date-Klasse nimmt also den Beginn des Tages, wie in der Standardzeitzone Ihrer JVM definiert, und wendet diese Zeit auf das Date-Objekt an. Die Ergebnisse Ihres Codes variieren also je nachdem, auf welchem Computer er ausgeführt wird oder welche Zeitzone eingestellt ist. Wahrscheinlich nicht was du willst.
Wenn Sie nur das Datum ohne Zeitangabe möchten, z. B. für ein Geburtsdatum, möchten Sie möglicherweise kein
Date
Objekt verwenden. Möglicherweise möchten Sie nur eine Zeichenfolge des Datums im ISO 8601- Format von speichernYYYY-MM-DD
. Oder verwenden Sie einLocalDate
Objekt aus Joda-Time (siehe unten).Joda-Zeit
Das erste, was Sie in Java lernen sollten: Vermeiden Sie die notorisch lästigen Klassen java.util.Date & java.util.Calendar, die mit Java gebündelt sind.
Verwenden Sie , wie in der Antwort von user3277382 korrekt angegeben , entweder Joda-Time oder das neue Paket java.time. * In Java 8.
Beispielcode in Joda-Time 2.3
Auf die Konsole werfen ...
Beim Laufen…
java.time
In diesem Fall ist der Code für java.time fast identisch mit dem von Joda-Time .
Wir erhalten eine Zeitzone (
ZoneId
) und erstellen ein Datums- / Zeitobjekt, das dieser Zeitzone (ZonedDateTime
) zugewiesen ist . Anschließend erstellen wir mithilfe des Musters " Unveränderliche Objekte" neue Datums- und Uhrzeitangaben basierend auf dem gleichen Zeitpunkt des alten Objekts (Anzahl der Nanosekunden seit der Epoche ), weisen jedoch eine andere Zeitzone zu. Zuletzt erhalten wir eine,LocalDate
die weder Tageszeit noch Zeitzone hat. Beachten Sie jedoch, dass die Zeitzone bei der Bestimmung dieses Datums gilt (ein neuer Tag bricht in Oslo früher an als beispielsweise in New York ).Ü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 .
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 Zeichenfolgen, keine Notwendigkeit für
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 .quelle
Ein Grund dafür, dass der Konstruktor veraltet ist, ist, dass die Bedeutung des Jahresparameters nicht Ihren Erwartungen entspricht. Der Javadoc sagt:
Beachten Sie, dass das Feld Jahr die Anzahl der Jahre seitdem ist
1900
, sodass Ihr Beispielcode höchstwahrscheinlich nicht das tut, was Sie von ihm erwarten. Und das ist der Punkt.Im Allgemeinen unterstützt die
Date
API nur den modernen westlichen Kalender, verfügt über eigenwillig spezifizierte Komponenten und verhält sich inkonsistent, wenn Sie Felder festlegen.Die
Calendar
undGregorianCalendar
APIs sind besser alsDate
und die Joda-Time-APIs von Drittanbietern wurden allgemein als die besten angesehen. In Java 8 haben sie diejava.time
Pakete eingeführt, und diese sind jetzt die empfohlene Alternative.quelle
Ich bin auf diese Frage als Duplikat einer neueren Frage gestoßen, in der gefragt wurde, wie der nicht veraltete Weg zu
Date
einem bestimmten Jahr, Monat und Tag aussehen soll.Die Antworten hier sagen bisher, dass die
Calendar
Klasse verwendet werden soll, und das war wahr, bis Java 8 herauskam. Ab Java 8 ist dies jedoch die Standardmethode:Und wenn Sie wirklich wirklich einen brauchen
java.util.Date
, können Sie die Vorschläge in dieser Frage verwenden .Weitere Informationen finden Sie in der API oder in den Tutorials für Java 8.
quelle
Bitte beachten Sie, dass dies nicht
Calendar.getTime()
deterministisch ist, da der Tageszeitteil standardmäßig die aktuelle Zeit ist.Versuchen Sie zum Reproduzieren, den folgenden Code einige Male auszuführen:
Ausgabe zB:
Wenn Sie einige Minuten später genau denselben Code ausführen, erhalten Sie Folgendes:
Während die
set()
entsprechenden Felder gezwungen werden, Werte zu korrigieren, wird die Systemzeit für die anderen Felder verloren. (Oben mit Sun jdk6 & jdk7 getestet)quelle
Date
selbst ist nicht veraltet. Es sind nur viele seiner Methoden. Siehe hier für Details .Verwenden Sie
java.util.Calendar
stattdessen.quelle
Die meisten Java-Entwickler verwenden derzeit das Drittanbieterpaket Joda-Time . Es wird allgemein als eine viel bessere Implementierung angesehen.
Java 8 wird jedoch ein neues java.time. * -Paket haben . Weitere Informationen finden Sie in diesem Artikel, Einführung in die neue Datums- und Uhrzeit-API für JDK 8 .
quelle
Da der Date-Konstruktor veraltet ist, können Sie diesen Code ausprobieren.
quelle
Date
undCalendar
2019 sind schlechte Ratschläge.Ähnlich wie von Binnyb vorgeschlagen, können Sie die neuere Methode Kalender> GregorianCalendar verwenden. Siehe diese neueren Dokumente:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
quelle
Sie können eine Methode wie
new Date(year,month,date)
in Ihrem Code mithilfe derCalendar
Klasse erstellen .Es wird genauso funktionieren wie der veraltete Konstruktor von
Date
quelle
Instant
undZonedDateTime
.Der Datumskonstruktor erwartet Jahre im Format von Jahren seit 1900, nullbasierte Monate, einbasierte Tage und setzt Stunden / Minuten / Sekunden / Millisekunden auf Null.
Wenn wir also den Kalenderersatz (nullbasierte Jahre, nullbasierte Monate, einbasierte Tage) für den veralteten Datumskonstruktor verwenden, benötigen wir Folgendes:
Oder verwenden Sie Java 1.8 (mit nullbasiertem Jahr und einbasierten Monaten und Tagen):
Hier sind gleiche Versionen von Datum, Kalender und Java 1.8:
quelle
(der Weg vor Java-8)
quelle