1. Wechsel von DateKlasse zu CalendarKlasse

Programmierer liebten den DateKurs wegen seiner Einfachheit und Unterstützung für Unix-Standards, aber wie Sie wissen, hat jede Rose ihre Dornen.

Programmierer wollten eine „intelligente“ DateKlasse. Und sie bekamen, was sie wollten, in Form der CalendarKlasse. Es wurde als eine Möglichkeit konzipiert, nicht nur Daten zu speichern, sondern auch schwierige Operationen mit Daten durchzuführen.

Der vollständige Name der CalendarKlasse lautet java.util.Calendar. Vergessen Sie nicht, es einer Importanweisung hinzuzufügen, wenn Sie es in Ihrem Code verwenden möchten.

Mit diesem Befehl können Sie ein CalendarObjekt erstellen:

Calendar date = Calendar.getInstance();

Die statische getInstance()Methode der CalendarKlasse erstellt ein CalendarObjekt, das mit dem aktuellen Datum initialisiert wird. Der gewünschte Kalender wird basierend auf den Einstellungen des Computers erstellt, auf dem das Programm ausgeführt wird.

Oder genauer gesagt, der Kalender, den Sie erhalten ... Das liegt daran, dass die Menschen auf der Erde nicht auf einen einzigen Kalender beschränkt sind. Stattdessen verwenden sie viele. Und fast jeder von ihnen ist mit einer Religion oder einem Land verbunden. Die CalendarKlasse unterstützt drei davon:

Kalender Beschreibung
Gregorianischer Kalender Christlicher gregorianischer Kalender
Buddhistischer Kalender Buddhistischer Kalender
Japanischer Kaiserkalender Japanischer Kaiserkalender

Es gibt aber auch chinesische und arabische Kalender. Grundsätzlich ist der Umgang mit der Zeit nicht so einfach, wie es scheint.

Im chinesischen Kalender ist das Jahr zum Zeitpunkt des Schreibens dieser Lektion offiziell 4716. Und nach dem muslimischen Kalender ist das Jahr 1398. Willkommen in der großen Welt, mein Programmiererfreund.

2. Erstellen eines Kalenderobjekts

Wir werden den gregorianischen Kalender verwenden, da dieser der gebräuchlichste auf der Welt ist. Zumindest bis China Oracle kauft und den chinesischen Kalender zum Hauptkalender macht.

Mit einer Anweisung wie dieser können Sie ein Kalenderobjekt mit einem beliebigen Datum erstellen:

Calendar date = new GregorianCalendar(year, month, day);

Ja, man muss GregorianCalendarjedes Mal schreiben. Statt Calendarkönnen Sie auch schreiben GregorianCalendar– das geht auch. Aber Schreiben Calendarist einfach kürzer.

Das Jahr muss vollständig angegeben werden, z. B. kann man nicht 19 statt 2019 schreiben. Monate werden weiterhin von Null an nummeriert. Aber wie bisher werden die Tage des Monats nicht von Null an nummeriert. Nerds!

Um sowohl die Uhrzeit als auch das Datum festzulegen, müssen Sie die Uhrzeit als zusätzliche Argumente übergeben:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Bei Bedarf können Sie sogar Millisekunden eingeben. Sie sind der Parameter nach der Anzahl der Sekunden.

3. Anzeigen eines Kalenderobjekts auf dem Bildschirm

Wenn Sie ein Kalenderobjekt einfach auf dem Bildschirm ausdrucken, werden Sie mit dem Ergebnis nicht sehr zufrieden sein.

Code
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Konsolenausgabe
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Dabei ist zu beachten, dass ein Kalender ein Kalender und kein Datum ist : Er verfügt über alle möglichen Einstellungen, die alle auf dem Bildschirm angezeigt werden.

Es wäre angemessen, ein SimpleDateFormatObjekt zum Anzeigen eines Kalenders zu verwenden, aber bis wir es studiert haben, können Sie diesen Life-Hack verwenden.

Date date = calendar.getTime();

Ein CalendarObjekt kann einfach in ein Objekt umgewandelt werden , und Sie wissen bereits, wie ein Objekt Dateangezeigt wird . Sie können Code wie diesen verwenden, um ein Objekt in Folgendes Dateumzuwandeln :CalendarDate

Verwendung der getTime()Methode:

Code Konsolenausgabe
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Das ist eine ganz andere Sache, nicht wahr?

4. Arbeiten mit Elementen eines Datums

Um ein bestimmtes Element eines Datums (z. B. Jahr, Monat, ...) zu erhalten, Calendarverfügt die Klasse über die get()Methode. Es ist eine einzelne Methode, aber sie hat Parameter:

int month = calendar.get(Calendar.MONTH);

Wo calendarist eine CalendarVariable und MONTHein konstantes Feld der CalendarKlasse?

Sie übergeben der Methode eines der CalendarKonstantenfelder der Klasse als Argument getund erhalten als Ergebnis den gewünschten Wert.

Beispiele

Code Beschreibung
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


Ära (vor oder nach der gemeinsamen Ära)
Jahr
Monat
Tag des Monats

Tag der Woche
Stunden
Minuten
Sekunden

Um ein Element eines Datums zu ändern, verwenden Sie die setMethode:

calendar.set(Calendar.MONTH, value);

Wo calendarist eine CalendarVariable und MONTHein konstantes Feld der CalendarKlasse?

Wenn Sie mit setder Methode arbeiten, übergeben Sie eines der Calendarkonstanten Felder der Klasse als erstes Argument und den neuen Wert als zweites Argument.

Beispiele

Code Beschreibung
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


Jahr = 2019
Monat = Juli (nummeriert von 0)
4. Tag
Stunden
Minuten
Sekunden

5. Konstanten der CalendarKlasse

Die konstanten Felder der CalendarKlasse sind nicht auf die Benennung von Elementen eines Datums beschränkt. Es scheint Felder für jeden Anlass zu geben.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Es gibt beispielsweise konstante Felder, die sich auf Monate beziehen:

Und auch die Wochentage:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Wir werden nicht alles auflisten. Wir möchten nur nicht, dass Sie überrascht sind, wenn Sie solche Konstanten im Code sehen.

Durch die Verwendung von Konstanten wird der Code besser lesbar, weshalb die Programmierer sie verwenden. Um die Lesbarkeit zu verbessern, werden die Monate ebenfalls von Null an nummeriert. Oder nicht.

6. Ändern des Datums in einem CalendarObjekt

Die CalendarKlasse verfügt über eine Methode, mit der Sie ein Datum auf intelligentere Weise bearbeiten können. Beispielsweise können Sie einem Datum ein Jahr, einen Monat oder mehrere Tage hinzufügen. Oder nimm sie weg. Diese Methode heißt add(). Die Arbeit damit sieht so aus:

calendar.add(Calendar.MONTH, value);

Wo calendarist eine CalendarVariable und MONTHein konstantes Feld der CalendarKlasse?

Wenn Sie mit addder Methode arbeiten, übergeben Sie als erstes Argument eines der CalendarKonstantenfelder der Klasse und als zweites Argument den neu hinzuzufügenden Wert.

Dies ist eine weitere intelligente Methode. Mal sehen, wie intelligent es ist:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Konsolenausgabe
Fri Mar 01 00:00:00 EET 2019

Diese Methode geht davon aus, dass der Februar 2019 nur 28 Tage hat, sodass das resultierende Datum der 1. März ist.

Nehmen wir uns jetzt 2 Monate Zeit! Was sollen wir bekommen? 27. Dezember 2018! Schauen wir uns das jetzt an.

Um eine Operation auszuführen, die zu einem früheren Datum führt, müssen Sie der add()Methode einen negativen Wert übergeben:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konsolenausgabe
Thu Dec 27 00:00:00 EET 2018

Es klappt!

Diese Methode berücksichtigt die unterschiedliche Länge von Monaten und Schaltjahren. Alles in allem eine tolle Methode. Es ist genau das, was die meisten Programmierer, die mit Datumsangaben arbeiten, brauchen.

7. Rollelemente eines Datums

Aber manchmal gibt es Situationen, in denen wir dieses kluge Verhalten nicht wollen, z. B. wenn Sie etwas an einem Teil des Datums ändern möchten, ohne alles andere zu ändern.

Die Klasse verfügt hierfür Calendarüber die spezielle Methode. roll()Seine Signatur ist genau wie die add()Methode, aber diese Methode ändert nur ein Element des Datums und lässt den Rest unverändert.

Beispiel:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konsolenausgabe
Fri Dec 27 00:00:00 EET 2019

Wir haben den Monat geändert, aber das Jahr und das Datum blieben unverändert.