webentwicklung-frage-antwort-db.com.de

Warum wurden die meisten Java.util.Date-Methoden veraltet?

Wenn Sie sich das Javadoc der Java.util.Date-Klasse ansehen, sind die meisten Methoden veraltet. Warum wurde das gemacht?

45
Daniel Kaplan

Nun, aus zwei verwandten Gründen. Es war eine sehr schlechte Umsetzung des Konzepts von Dates and Times und wurde durch die Klasse Calendar ersetzt.

Die Klasse Calendar ist zwar eine Verbesserung, lässt aber auch zu wünschen übrig. Für ernsthafte Arbeit mit Datum/Uhrzeit empfiehlt jeder Joda-Time . Java 8 bringt das neue Java.time. * -Paket , inspiriert von Joda-Time, definiert durch JSR-310 , und soll die alten Date/Calendar-Klassen ersetzen.

Bearbeiten: Als Antwort auf die spezifische Frage, warum die Implementierung schlecht ist, gibt es viele Gründe. Das JavaDoc fasst es wie folgt zusammen:

Leider konnte die API für diese Funktionen nicht internationalisiert werden.

Zusätzlich zu diesem allgemeinen Mangel (der Probleme wie das Fehlen einer Zeitzonenkomponente sowie die Datumsformatierung abdeckt, die in DateFormat besser behandelt wird, und die Unfähigkeit, eine nicht-gregorianische Kalenderdarstellung zu haben), gibt es bestimmte Probleme, die wirklich weh tun die Klasse Date, einschließlich der Tatsache, dass das Jahr in einem Versatz von 1900 gegenüber dem Jahr der Ära Common dargestellt wird.

Calendar hat seine eigenen Probleme, aber schon in JDK 1.1 war es offensichtlich, dass Java.util.Date es nicht schneiden würde. Obwohl Calendar die schlimmste JDK-API ist, hat es bis zur Version 7 gedauert, bis versucht wurde, sie zu beheben.

44
Yishai
  • Date ist veränderlich
  • Date unterstützt keine Zeitzonen

Letzteres führte dazu, dass es durch Calendar ersetzt wurde. Und erstere, kombiniert mit der Benutzerfreundlichkeit, führten dazu, dass beide durch Joda-Time / JSR-310 ( Java.time. * Package ) ersetzt wurden.

16
Bozho

Sie sind veraltet, weil Date so schnell wie möglich geschrieben wurde, als sie das JDK aus der Tür hetzen wollten.

Es stellt sich heraus, dass die Daten und Kalender schwierig sind. Also erstellten sie die Calendar-Klasse, die viel mehr darüber nachdachte, um die harten Teile der Arbeit mit Kalendern zu handhaben.

Sie haben die Date-Methoden verworfen und an Calendar delegiert, weil sie das Verhalten der vorhandenen Date-Methoden nicht ändern und möglicherweise vorhandene Anwendungen beschädigen wollten.

10
Will Hartung

Hier ist eine gute Antwort direkt von Oracle: http://www.Oracle.com/technetwork/articles/Java/jf14-date-time-2125367.html

Ein langjähriger Fehler von Java-Entwicklern war die unzureichende Unterstützung für die Anwendungsfälle von Datum und Uhrzeit gewöhnlicher Entwickler.

Beispielsweise sind die vorhandenen Klassen (z. B. Java.util.Date und SimpleDateFormatter) nicht threadsicher, was zu potenziellen Problemen bei der gleichzeitigen Verwendung für Benutzer führt - etwas, mit dem der durchschnittliche Entwickler beim Schreiben von Code für die Datumsverarbeitung nicht rechnen würde.

Einige der Datums- und Zeitklassen weisen auch ein recht schlechtes API-Design auf. Zum Beispiel beginnen Jahre in Java.util.Date um 1900, Monate um 1 und Tage um 0 - nicht sehr intuitiv.

... Java.util.Date stellt einen Moment auf der Zeitachse dar - ein Wrapper um die Anzahl der Millisekunden seit der UNIX-Epoche -, aber wenn Sie toString () aufrufen, deutet das Ergebnis darauf hin, dass es eine Zeitzone hat, was bei den Entwicklern Verwirrung stiftet.

2
Daniel Kaplan

Ich kenne den offiziellen Grund nicht, warum es veraltet ist, aber soweit ich GregorianCalendar und Joda-Time Support-Vorgänge an Daten feststellen kann, bedeutet dies, dass Sie zum Beispiel einen Tag zu einem Datum hinzufügen und haben können Monat und Jahr werden entsprechend aktualisiert.

Angenommen, Sie möchten den Tag nach dem aktuellen Datum und heute den 31. Mai berechnen. Mit Java.util.Date haben Sie nur getDays() +1, das 32 zurückgibt, und Sie müssen selbst mit dem Wissen umgehen, dass der aktuelle Monat keine 32 Tage hat. Wenn Sie GregorianCalendaroder Joda.time zum 31. Mai einen Tag hinzufügen, wird ein Objekt angezeigt, das den 1. Juni darstellt und die Komplexität vor Ihren Augen verbirgt.

0
Raibaz