Seit der Veröffentlichung von Java 8 im Jahr 2014 ist unser alter Java.util.date endlich nicht mehr die einzige Wahl für Betriebsdaten und Zeit in Java.
Tatsächlich wurden die damit verbundenen Apis von Datum und Uhrzeit in Java immer von der Welt kritisiert. Nicht nur, weil seine Entwurfsabteilung unklar ist, sondern auch oft sowohl Daten als auch Zeit damit umgehen kann, was sehr verwirrend ist. Es werden auch numerische Zuordnungen bestimmter Jahre, Monate und Daten gegen Menschen gespeichert, wie z.
Wenn wir ein bestimmtes Jahr und Monatwert erhalten, müssen wir häufig entsprechende Operationen durchführen, um genaue Informationen zu Jahr, Monat und Datum zu erhalten. Bis zu unserem Java 8 haben wir uns das hervorragende Design der Open-Source-Bibliothek der Drittanbieter Joda-Zeit ausgeliehen und eine Datum und Uhrzeit-API neu gestaltet. Im Vergleich zum vorherigen kann man sagen, dass es hundertmal einfacher ist. Alle zugehörigen API -Schnittstellen befinden sich im Paket java.time.
Altes Datum und Uhrzeitoberfläche
Datum, das die Zeitinformationen darstellt
Alle Computer der Welt verwenden eine Ganzzahl vom Typ Long, und der Wert dieser Ganzzahl ist die Anzahl der Millisekunden in Bezug auf GMT in Großbritannien (0: 0: 00, 1. Januar 1970). Zum Beispiel:
public static void main (String [] args) {// 1. Januar 1970 00:00:00 GMT. Datum Datum = neues Datum (1000); System.out.println (Datum);}Ausgangsergebnis:
// 1970-1-1 8: 00: 01. Jan. 01 08:00:01 CST 1970
Viele Menschen fragen sich vielleicht, 1000 bedeutet 1 Sekunde vor der Standardzeit. Warum vergeht die Zeit acht Stunden mehr?
Dies hat etwas mit der "Zeitzone" zu tun. Wenn Sie sich in Greenwich befinden, wird das Ergebnis erwartungsgemäß sein, aber wir befinden uns im östlichen achten Bezirk Chinas, und die Zeit ist acht Stunden früher, sodass die Grundwerte auf unterschiedlichen Zeitzonen unterschiedlich sind.
Die Date -Klasse hat schon viele Rollen gespielt. Aus seinem Quellcode ist es zu erkennen, dass es Methoden gibt, die Zeit betreiben können, Methoden, die Jahr, Monat und Tag betreiben und sogar Zeitzonen verwalten können. Es kann gesagt werden, dass es ausreicht, es allein am Datum und der Uhrzeitbeschäftigung zu haben.
Aber das ist die Welt. Wenn Sie sich zu sehr interessieren, können Sie natürlich nicht alles abdecken. Das Design vieler Methoden im Datum ist nicht sehr vernünftig. Wir haben es auch schon einmal gesagt, und es ist sogar ein bisschen gegen Human. Daher wurden fast 80% der Methoden in der aktuellen Datumsklasse aufgegeben und werden @Deprecated gekennzeichnet.
Die derzeitige Positionierung von Sun Company for Date besteht darin, nur einen Moment darzustellen, sodass sich die interne Position um die Millisekunden dieser Ganzzahl dreht und sich nicht mehr auf verschiedene jährliche Kalenderzeitzonen und andere Informationen konzentriert.
Das Datum ermöglicht es, dass ein Objekt über zwei Konstruktoren instanziiert wird:
private transient long fasttime; public date () {this (System.currentTimemillis ());} öffentliches Datum (langes Datum) {fastTime = Datum;}Das FastTime -Attribut hier speichert die Anzahl der Millisekunden, die der Zeit entsprechen. Die beiden Konstruktoren sind immer noch sehr einfach. Wenn der parameterlose Konstruktor aufgerufen wird, weist die virtuelle Maschine den aktuellen Zeitwert des Systems FastTime zu.
Es gibt einige andere Methoden, die nicht verworfen wurden:
Es gibt zwei weitere Methoden, die anschließend zu JDK1.8 hinzugefügt werden, und werden verwendet, um neue Schnittstellen in Java 8 umzuwandeln, die später eingeführt werden.
Kalender, der den Almanach beschreibt
Kalender wird verwendet, um Datumsinformationen wie Jahr, Monat, Tag usw. darzustellen. Es handelt sich um eine abstrakte Klasse, sodass sein Instanzobjekt im Allgemeinen durch die folgenden vier Fabrikmethoden erhalten wird.
öffentlicher statischer Kalender GetInstance () öffentlicher statischer Kalender GetInstance (TimeZone Zone) öffentlicher statischer Kalender
Tatsächlich wird die gleiche interne Methode irgendwann genannt:
privates statischer Kalender Createcalendar (Timezone Zone, Alocale des Gebietsschale)
Diese Methode erfordert zwei Parameter, eine ist die Zeitzone und das andere ist das Land und die Sprache. Das heißt, das Erstellen einer Kalenderinstanz erfordert mindestens diese beiden Parameterinformationen, andernfalls werden die Standardzeitzone oder Sprachinformationen verwendet.
Da verschiedene Zeitzonen und Nationalsprachen für Zeit-, Monats- und Tagesinformationen unterschiedlich ausgeben, ist dies auch ein Grund, warum eine Kalenderinstanz Zeitzone und Länderinformationen verabschieden muss. Siehe ein Beispiel:
public static void main (String [] args) {calendar calendar = calendar.getInstance (); System.out.println (Calendar.getTime ()); Calendar Calendar1 = Calendar.getInstance (TimeZone.getTimeZone ("GMT"), Local.English); System.out.println (Calendar1.get (Calendar.year) + ":" + calendar1.get (Calendar.Hour) + ":" + calendar1.get (calendar.minute)); }Ausgangsergebnis:
Sa 21. April 10:32:20 CST 20182018: 2: 32
Wie Sie sehen können, ist die erste Ausgabe die aktuelle Zeit der Standardzeitzone und des Landes unseres Systems, und in der zweiten Kalenderinstanz haben wir angegeben, dass es sich in der Zeitzone Greenwich (0 Zeitzone) befindet, und das Ergebnis ist auch mit einer achtstündigen Differenz offensichtlich, da wir uns im östlichen Achter befinden, was acht Stunden früher als die Zeitzone 0 ist.
Einige Leute fragen sich vielleicht, warum die Ausgabe der zweiten Kalenderinstanz dem Spleiß so kompliziert ist, anstatt die GetTime -Methode direkt wie die erste Kalenderinstanz zu rufen?
Dies beinhaltet die interne Implementierung des Kalenders. Schauen wir uns zusammen:
Lange geschützt; öffentliches Enddatum GetTime () {Neues Datum zurückgeben (GetTimeInmillis ());}Wie Datum führt der Kalender eine Zeitinformationen im Inneren und die GetTime -Methode erstellt tatsächlich ein Datumsobjekt basierend auf dieser Zeit und Rückgaben.
Wenn wir eine Kalenderinstanz erstellen, werden wir im Allgemeinen keine Zeitinformationen übergeben. Wenn die Instanz initialisiert wird, berechnet das Programm eine Millisekundennummer basierend auf der Standardzeitzone und der aktuellen Zeit des Systems und zuordnen sie der Zeit zu.
In allen Kalenderinstanzen, deren Zeitattributwert nicht manuell geändert wurde, ist der Zeitwert der Zeitwert der Standardzeitzone zu diesem Zeitpunkt. Mit anderen Worten, das Ausgabeergebnis von GetTime ignoriert die Zeitzoneninformationen, die der aktuellen Instanz entsprechen. Dies ist auch ein Fehler im Kalenderdesign, da dies dazu führt, dass der GetTime -Ausgangswert der beiden Kalenderinstanzen nur von der Laufzeit des Systems abhängt, wenn die Instanz initialisiert wird.
Kalender definiert auch viele statische Konstanten und einige Attribut -Arrays:
öffentliche endgültige statische int era = 0; öffentliches endgültiges statisches int Jahr = 1; öffentliches endgültiges statisches int monat = 2; öffentliches endgültiges statisches int week_of_year = 3; öffentliches endgültiges statisches int week_of_month = 4; öffentliches endgültiges statisches int date = 5;
Alle relevanten Informationen zu Daten werden im Attributarray gespeichert, und die Werte dieser statischen Konstanten stellen häufig einen Indexwert dar. Durch die Get -Methode geben wir einen Attributindex über und geben den Wert des Attributs zurück. Zum Beispiel:
Kalender mycalendar = calendar.getInstance (); int Jahr = mycalendar.get (calendar.year);
Die GET -Methode hier besteht tatsächlich darin, Felder [1] direkt als Rückgabewert zu nehmen. Das Fields Attribut -Array wird vom System gemäß der Zeitzone und Sprache berechnet und zugeordnet, wenn die Kalenderinstanz initialisiert wird. Beachten Sie, dass es auf der Grundlage der von Ihnen angegebenen Zeitzone berechnet wird, im Gegensatz zur Zeit, die immer auf der Systemversandzeitzone basiert.
Ich persönlich denke, dass das Design des Kalenders elegante und unvernünftige Aspekte hat. Schließlich ist es ein "Antiquitäten" und wird schließlich ersetzt.
DateFormat -Formatkonvertierung
Wie wir aus einem unserer früheren Beispiele erkennen können, ist es sehr problematisch, Datumsinformationen in einem erwarteten Format für Kalender auszugeben und manuell gespleißt werden. Unser DateFormat wird verwendet, um die Konvertierung zwischen formatierten Zeichenfolgen und Angaben zu bewältigen.
Wie Kalender ist DateFormat auch eine abstrakte Klasse. Wir müssen sein Instanzobjekt über Fabrikmethoden generieren. Es gibt hauptsächlich die folgenden Fabrikmethoden:
// Verarbeitungszeit Conversion öffentlich endgültige statische DatumFormat GetTimeInstance () // Nur Prozessdatumkonvertierung öffentliche endgültige statische DatumFormat getDatEnstance () // Sie können sowohl Zeit als auch Datum der öffentlichen endgültigen statischen DatumFormat getDatetimeInstance () verarbeiten ()
Natürlich haben sie jeweils ihre eigenen Überladungsmethoden, und wir werden die Details später sehen.
Es gibt zwei Arten von Methoden für DateFormat, Format und Analyse.
Public Final String Format (Datum Datum) öffentliches Datum analysieren (Zeichenfolgequelle)
Die Formatmethode wird verwendet, um ein Datumsobjekt als Zeichenfolge zu formatieren, und die Parse -Methode wird verwendet, um eine formatierte Zeichenfolge durch ein Datumsobjekt zu ersetzen. Zum Beispiel:
public static void main (String [] args) {calendar calendar = calendar.getInstance (); DateFormat DateFormat = DateFormat.getDatetimeInstance (); System.out.println (DateFormat.format (Calendar.getTime ()));};Ausgangsergebnis:
2018-4-21 16:58:09
Offensichtlich kann eine fabrikkonstruierte DateFormat-Instanz den Inhalt des Ausgabebodusformats nicht anpassen, dh das Ausgabestnungsformat ist festgelegt und kann die besonderen Bedürfnisse in einigen Fällen nicht erfüllen. Im Allgemeinen verwenden wir direkt eine der Implementierungsklassen, SimpleDateFormat.
Mit SimpledateFormat können Sie einen Musterparameter übergeben, wenn Sie eine Instanz erstellen, um das Ausgabeformat der Datumszeichen anzupassen. Zum Beispiel:
public static void main (String [] args) {DateFormat DateFormat = new SimpleDateFormat ("YYYYY YEA MM Monat DD Day"); System.out.println (DateFormat.format (New Date ()));};Ausgangsergebnis:
21. April 2018
In,
Natürlich ist es auch sehr bequem, Stringdaten zu konvertieren. Anpassungsmodi sind erlaubt, aber Sie müssen sich an die von Ihnen selbst festgelegten Muster halten, sonst kann das Programm nicht erfolgreich analysieren. Zum Beispiel:
public static void main (String [] args) {String str = "Samstag, 21. April 2018"; DateFormat SDateFormat = new SimpledateFormat ("Yjyy Year M Month Dd Day HH Point Mm Point E"); sDateFormat.Parse (str); System.out.println (sdateFormat.getCalendar (). GetTime ());};Ausgangsergebnis:
Sa 21. April 17:17:00 CST 2018
Offensichtlich analysiert das Programm unsere Zeichenfolge korrekt und konvertiert sie in ein Kalenderobjekt, das in DateFormat gespeichert ist.
Im Allgemeinen konnten Datum, Kalender und DateFormat allgemeine Uhrzeit- und Datumsprobleme behandeln, aber zwangsläufig sind sie immer noch umständlich und schwierig zu verwenden.
Aus Platzbeschränkungen vergleichen wir Java 8's neues Datum und Uhrzeit -API von Java 8 im nächsten Artikel, und Sie werden feststellen, dass es ein eleganteres Design und ein einfacheres Betrieb hat.