2010-07-29 22 views
8

Was ist wirklich gemeint, wenn Sie Java Date-Dienstprogramme verwenden und etwas veraltet ist. Bedeutet dies, dass der Gebrauch davon abgeraten wird, oder bedeutet dies, dass es verboten ist?Veraltete Datumsmethoden in Java?

Ich rate, es ist schlechte Praxis, veraltete Methoden zu verwenden, aber bin mir nicht sicher und wollte es herausfinden.

Zum Beispiel, Ich versuche, Code wie die

String date = request.getParameter("date"); 
model.setDate(new Date(date)); 

Natürlich folgenden verwenden ... das ist ein hohes Maß Beispiel, aber in dieser Situation verwendet mein Modell Datum und ich tippe Sie müssen das Datum als String abziehen und ein Datum damit erstellen.

Es funktioniert gut, wie ich es habe, aber es verwendet eine veraltete Methode.

EDIT - Ich habe wieder weg und verwendet

 
SimpleDateFormat formatter = new SimpleDateFormat(); 
model.setDate(formatter.parse(request.getParameter("date");



Das Datum ist im Format TT/MM/YYY wie 2010.07.23, aber ich bin immer ein ParseException

Was könnte das sein?

Antwort

6

Du hast Recht, dass diese schlechte Praxis. In fast allen Fällen geben veraltete Methoden an, was zu verwenden ist, und dies ist keine Ausnahme (siehe the Javadocs).

Sie versuchen, eine Date aus einer String zu erstellen. Aber welches Format hat der String? Wie sollte es geparst werden? Ist es ein britisches oder US-amerikanisches Datumsformat?

Die "richtige" Möglichkeit, dies zu tun, ist eine Instanz von SimpleDateFormat zu erstellen, und rufen Sie ihre parse() Methode über Ihre Zeichenfolge übergeben. Dies funktioniert garantiert in Zukunft und wird jetzt robuster sein.

+4

brechen können ... oder vorzugsweise, verwenden Sie eine bessere API wie Joda Time :) –

+1

Nun ... ja. :-) Aber vorschlagen, den gesamten vorhandenen Code neu zu schreiben, um neue Date-Objekte zu verwenden, ist für diese * Situation übertrieben. –

+2

@ Jon Skeet, die Probleme mit der Verwendung von Better API besteht darin, dass Sie ein Verzeichnis von APIs haben und ständig nach neuen Releases in Repositories suchen müssen. –

-1

Nichts wird brechen, wenn Sie sie verwenden ... noch.

Sie können jedoch in zukünftigen Versionen entfernt werden.

+0

die meisten der Datumsbezogenen Abwertungen sind aufgrund von Bugs, so dass Dinge wegen der Bugs –

2

Was "Veraltet" Bedeutet

Sie den Begriff gehört hat, "selbstironischen Humor" oder Humor , dass der Bedeutung des Sprechers minimiert. Eine veraltete Klasse oder Methode ist so. Es ist nicht mehr wichtig. Es ist so unwichtig, in Tatsache, dass Sie nicht mehr verwenden sollten es, da es ersetzt wurde und kann aufhören zu existieren in der Zukunft.

Java bietet eine Möglichkeit, deprecation weil als Klasse weiterentwickelt, seine API (Application Programming Interface) zwangsläufig Änderungen auszudrücken: Methoden für Konsistenz, neue und bessere Methoden umbenannt werden hinzugefügt werden, und Felder ändern . Aber solche Änderungen führen zu einem Problem. Sie benötigen , um die alte API herumzuhalten, bis Entwickler den Übergang zum Neuen machen, aber Sie wollen nicht, dass sie mit der Programmierung der alten API fortfahren.

Die Fähigkeit, eine Klasse zu verwerfen, Methode oder Mitglied Feld löst das Problem. Java unterstützt zwei Mechanismen für Depretierung: und eine Annotation, (unterstützt ab J2SE 5.0) und ein Javadoc-Tag (seit 1.1 unterstützt). Bestehende Aufrufe der alten API werden fortgesetzt funktionieren, aber die Annotation bewirkt, dass der Compiler eine Warnung ausgibt, wenn er Verweise auf veraltete Programmelemente findet. Das Javadoc-Tag und verknüpfte Kommentare warnen Benutzer vor mit dem veralteten Element und sagen ihnen was zu verwenden stattdessen.hier was stattdessen zu verwenden.

http://download-llnw.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

3

Veraltete Objekte oder Methoden bedeutet nur, dass wenn Sie es im aktuellen Projekt verwenden möchten, lieber empfohlen. Der Grund, warum sie immer noch vorhanden sind, ist für Legacy-Codes, die die veraltete Methode vor verwendet haben, die veraltet war. Ein typisches Beispiel ist StringTokenizer vs String.split() Methode.

Verwenden Sie für Ihr Date-Beispiel SimpleDateFormat, um die Konvertierung von String in Date durchzuführen. Auf diese Weise können Sie ein Datumsformat erstellen, aus dem das Zeichenfolgedatum analysiert werden kann, um ein Date-Objekt zu erstellen.


Für Ihre EDIT dies tun

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); 

model.setDate(formatter.parse(request.getParameter("date"))); 

ParseException verursacht, da Sie kein Datum Formatstruktur, so dass die Simple nicht wissen, wie Sie das Datum strukturiert wurde vorsah.

+0

Sollte es nicht MM/TT/JJJJ sein? – CoolBeans

+0

@CoolBeans, true .... Ich habe die Änderung bearbeitet. –

1

Veraltet bedeutet, dass es zum Entfernen geplant ist, weil es fehlerhaft oder aus einem anderen schlechten Grund ist. Es ist besser, SimpleDateFormat.parse(); zu verwenden, um Ihre Zeichenfolgen zu analysieren.

1

Wenn Sun (Oracle, was auch immer) eine Java-Methode als veraltet deklariert, heißt das, dass sie ihre Meinung geändert haben, sie einzuschalten, sie von der Verwendung abhalten und sie in einer zukünftigen Version entfernen können. Natürlich wird es wahrscheinlich eine lange Zeit dauern, bis es entfernt wird, denn wer weiß, wie viel existierender Code dort draußen verwendet wird, und was ist der Punkt, bestehende Programme zu brechen, nur weil die Erfinder von Java denken, dass sie jetzt eine bessere Vorstellung davon haben etwas zu tun?

Vermutlich hatten sie einen guten Grund, etwas abzulehnen, also sollten Sie herausfinden, WARUM sie sagen, dass eine neuere Funktion besser ist.

Im Fall veralteter Date-Methoden bedeutet dies normalerweise, dass sie vorschlagen, dass Sie jetzt die Calendar- oder SimpleDateFormat-Klassen verwenden. In Ihrem Fall wahrscheinlich letzteres.

2

Sie haben Recht, Es ist entmutigt, veraltete Methoden zu verwenden. Dies liegt daran, dass diese Methoden in einigen Situationen Probleme aufweisen können oder durch optimistischere Lösungen ersetzt wurden. Auch zukünftige Versionen unterstützen diese möglicherweise nicht.

0

veralteten: etwas, das in der aktuellen Version von Java existiert, wird aber von zukünftigen Versionen irgendwann entfernt werden.

Für Ihre bearbeiten, müssen Sie richtig die Simple initialisieren, so weiß es, welches Format in kommt für 1978.07.22 Format:.

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

3

Viele Leute, was Veraltete erwähnt haben I bedeutet, aber sehe keine Erklärung, warum diese Methoden sind veraltet:

Sun (bevor sie Teil von Oracle waren) ist veraltet und eine Reihe von Methoden in Date zu Menschen bekommen die Calendar/GregorianCalendar Klassen für Datum Manipulation zu verwenden stattdessen.

0

Wie bereits erwähnt, waren die java.util.Date-Methoden veraltet, weil das Java-Team glaubte, sie hätten eine bessere Lösung im java.util.Calendar.

Leider erwies sich diese Klasse auch als verwirrend, mühsam und schlecht gestaltet.

Also, ja, Sie sollten veraltete Methoden aus Rücksicht auf ihre Ersetzungen vermeiden. Aber jetzt haben diese Ersetzungen (.Calendar) eine Ersetzung (java.time).

java.time

Alle alten Datum-Zeit-Klassen durch die in Java 8. Die neuen Klassen von der sehr erfolgreichen Joda-Time Rahmen inspiriert gebaut java.time Rahmen verdrängte wurden, als dessen Nachfolger bestimmt sind, vom Konzept her ähnlich aber neu gestaltet. Definiert von JSR 310. Erweitert um das Projekt ThreeTen-Extra. Siehe die Tutorial.

Verwenden Sie das java.time.format-Paket zum Analysieren und Generieren von String-Darstellungen von Datums- und Uhrzeitwerten.

String input = "07/23/2010"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); 

Die neuen Klassen umfassen LocalDate zur Darstellung eines Datum-only-Wert ohne Time-of-Tag.

LocalDate localDate = LocalDate.parse(input , formatter); 

Wenn Sie toString auf einem LOCALDATE rufen erhalten Sie eine String-Darstellung des Datumswert im Standard ISO 8601 Format YYYY-MM-DD. Um einen String in anderen Formaten zu generieren, definieren Sie einen anderen Formatierer. Oder rufen Sie die "localize" -Methoden auf, damit java.time bei der Bestimmung eines bestimmten lokalisierten Formats die Schwerarbeit übernimmt.