Java Calendar-Klasse

Die Calendar-Klasse ist eine abstrakte Klasse in Java für die Behandlung von Datums- und Zeitangaben. Sie befindet sich imjava.utilPaket. Diese Klasse bietet eine Reihe von Methoden zum Bearbeiten von Datums- und Zeitfeldern (wie Jahr, Monat, Tag, Stunde, Minute usw.) und kann Datumsberechnungen und -vergleiche durchführen.

Warum brauchen wir die Calendar-Klasse?

In Java kann die Date-Klasse zwar auch Datums- und Zeitangaben darstellen, weist jedoch die folgenden Einschränkungen auf:

  1. Die meisten Methoden sind veraltet
  2. Unterstützt keine Internationalisierung
  3. Begrenzte Funktionalität zur Datumsberechnung

Die Klasse Calendar löst diese Probleme und bietet leistungsfähigere und flexiblere Möglichkeiten zur Manipulation von Datum und Uhrzeit.


Grundlegende Verwendung der Klasse Calendar

Abrufen einer Calendar-Instanz

Da Calendar eine abstrakte Klasse ist, können wir sie nicht direkt instanziieren. Der Standardweg, eine Calendar-Instanz zu erhalten, ist:

Beispiel

Calendar calendar = Calendar.getInstance();

Diese Methode gibt eine Calendar-Instanz zurück (normalerweise GregorianCalendar) basierend auf der Standardzeitzone und dem Standard-Locale.

Einstellen von Datum und Uhrzeit

Wir können dieset()Methode zum Festlegen der verschiedenen Felder eines Calendar-Objekts:

Beispiel

// Jahr, Monat und Tag festlegen
calendar.set(2023, Calendar.NOVEMBER, 15);

// Jahr, Monat, Tag, Stunde, Minute und Sekunde festlegen
calendar.set(2023, Calendar.NOVEMBER, 15, 14, 30, 0);

Hinweis: Monate sind nullbasiert, wobei 0 für Januar und 11 für Dezember steht. Um Verwirrung zu vermeiden, wird empfohlen, die in der Klasse Calendar definierten Konstanten zu verwenden (z. B. Calendar.JANUARY, Calendar.FEBRUARY usw.).

Abrufen von Datums- und Uhrzeitinformationen

Verwenden Sie dieget()Methode zum Abrufen der verschiedenen Felder eines Calendar-Objekts:

Beispiel

int year = calendar.get(Calendar.YEAR);       // Das Jahr abrufen
int month = calendar.get(Calendar.MONTH);     // Den Monat abrufen (0-11)
int day = calendar.get(Calendar.DAY_OF_MONTH);// Den Tag abrufen
int hour = calendar.get(Calendar.HOUR_OF_DAY);// Die Stunde abrufen (24-Stunden-Format)
int minute = calendar.get(Calendar.MINUTE);   // Die Minute abrufen
int second = calendar.get(Calendar.SECOND);   // Die Sekunde abrufen

Gängige Methoden der Calendar-Klasse

Datumsberechnung

Die Calendar-Klasse bietet praktische Methoden zur Datumsberechnung:

Beispiel

// 10 Tage zum aktuellen Datum hinzufügen
calendar.add(Calendar.DAY_OF_MONTH, 10);

// 3 Monate vom aktuellen Monat subtrahieren
calendar.add(Calendar.MONTH, -3);

Datumsvergleich

Wir können diecompareTo()Methode zum Vergleichen zweier Calendar-Objekte:

Beispiel

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.DAY_OF_MONTH, 1);

int result = cal1.compareTo(cal2);
// result < 0 bedeutet, dass cal1 früher als cal2 ist
// result == 0 bedeutet, dass cal1 gleich cal2 ist
// result > 0 bedeutet, dass cal1 später als cal2 ist

Abrufen eines Zeitstempels

Sie können diegetTimeInMillis()Methode zum Abrufen des Zeitstempels (Millisekunden), der von einem Calendar-Objekt dargestellt wird:

Beispiel

long timestamp = calendar.getTimeInMillis();

Sie können auch diegetTime()Methode, um es in ein Date-Objekt umzuwandeln:

Beispiel

Date date = calendar.getTime();

Fortgeschrittene Verwendung der Calendar-Klasse

Zeitzone festlegen

Wir können eine bestimmte Zeitzone für ein Calendar-Objekt festlegen:

Beispiel

TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
calendar.setTimeZone(timeZone);

Calendar-Feldoperationen

Die Klasse Calendar bietet dieroll()Methode, mit der ein Feld gerollt werden kann, ohne andere Felder zu beeinflussen:

Beispiel

// 1 zum Monat hinzufügen, aber das Jahr nicht ändern
calendar.roll(Calendar.MONTH, true);  // Oder calendar.roll(Calendar.MONTH, 1);

Den ersten Tag der Woche ermitteln

Verschiedene Regionen definieren den ersten Tag der Woche unterschiedlich (manche verwenden Sonntag, manche verwenden Montag):

Beispiel

int firstDayOfWeek = calendar.getFirstDayOfWeek();

Umfassendes Beispiel

Beispiel

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

public class CalendarDemo {
    public static void main(String[] args) {
        // 1. Eine Calendar-Instanz abrufen (verwendet standardmäßig aktuelles Datum und aktuelle Uhrzeit)
        Calendar calendar = Calendar.getInstance();
       
        // 2. Die Werte verschiedener Felder abrufen
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; // Der Monat ist 0-basiert, also 1 addieren
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24-Stunden-Format
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
       
        System.out.printf("Aktuelle Zeit: %d Jahr %d Monat %d Tag %d:%d:%d%n",
                        year, month, day, hour, minute, second);
       
        // 3. Ein bestimmtes Datum und eine bestimmte Uhrzeit festlegen
        calendar.set(2023, Calendar.MAY, 15, 10, 30, 0); // 15. Mai 2023 10:30:00
       
        // 4. SimpleDateFormat für formatierte Ausgabe verwenden
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Zeit nach dem Setzen: " + sdf.format(calendar.getTime()));
       
        // 5. Datumsarithmetik
        calendar.add(Calendar.DAY_OF_MONTH, 5); // 5 Tage hinzufügen
        calendar.add(Calendar.HOUR, -3); // 3 Stunden subtrahieren
       
        System.out.println("Zeit nach Berechnung: " + sdf.format(calendar.getTime()));
       
        // 6. Daten vergleichen
        Calendar anotherCalendar = new GregorianCalendar(2023, Calendar.JUNE, 1);
        System.out.println("Vergleichsergebnis: " +
            (calendar.before(anotherCalendar) ? "vorher" : "nachher"));
       
        // 7. Wochentag ermitteln (Sonntag=1, Samstag=7)
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        System.out.println("Wochentag" + getChineseWeekday(dayOfWeek));
    }
   
    private static String getChineseWeekday(int dayOfWeek) {
        String[] weekdays = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
        return weekdays[dayOfWeek];
    }
}

Ausgabeergebnis:

当前时间: 2023年5月15日 14:25:36
设置后的时间: 2023-05-15 10:30:00
运算后的时间: 2023-05-20 07:30:00
比较结果: 之前
星期二

Hinweise zur Calendar-Klasse

  1. Monate sind 0-basiert: In der Calendar-Klasse sind Monate 0-basiert (0=Januar, 11=Dezember), was leicht zu Fehlern führen kann.

  2. Veränderbarkeit: Calendar-Objekte sind veränderbar; das Ändern eines Calendar-Objekts wirkt sich auf alle Stellen aus, die darauf verweisen.

  3. Threadsicherheit: Die Calendar-Klasse ist nicht threadsicher, und in Multithread-Umgebungen ist zusätzliche Synchronisierung erforderlich.

  4. Leistung: Häufiges Erstellen von Calendar-Instanzen beeinträchtigt die Leistung; ziehen Sie in Betracht, Instanzen wiederzuverwenden.

  5. Zeitzonenprobleme: Standardmäßig wird die Systemzeitzone verwendet, und bei Anwendungen über mehrere Zeitzonen hinweg ist besondere Aufmerksamkeit erforderlich.


Alternative in Java 8

Ab Java 8 gibt es eine neue Datums-/Zeit-API (diejava.timepackage) wurde eingeführt und bietet eine modernere und einfachere Möglichkeit, mit Datums- und Zeitangaben umzugehen. Wenn Sie Java 8 oder höher verwenden, wird empfohlen, die neue API zu bevorzugen:

Beispiel

// Neue API zum Ersetzen von Calendar
LocalDate date = LocalDate.now();
LocalDateTime dateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.now();

Die neue API löst viele Probleme der Calendar-Klasse, darunter bessere Threadsicherheit, ein intuitiveres API-Design und leistungsfähigere Funktionalität.


Gängige Methoden der Java-Klasse Calendar

Die folgenden sind gängige Methoden der Klasse java.util.Calendar:

Grundlegende Methoden

Methode Beschreibung Beispiel
static Calendar getInstance() Ruft eine Calendar-Instanz mit der Standardzeitzone und dem Standard-Locale ab Calendar cal = Calendar.getInstance()
static Calendar getInstance(TimeZone zone) Ruft eine Calendar-Instanz mit der angegebenen Zeitzone ab Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"))
static Calendar getInstance(Locale locale) Ruft eine Calendar-Instanz mit dem angegebenen Locale ab Calendar cal = Calendar.getInstance(Locale.CHINA)
static Calendar getInstance(TimeZone zone, Locale locale) Ruft eine Calendar-Instanz mit der angegebenen Zeitzone und Locale ab Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"), Locale.CHINA)

Feldkonstanten (häufig)

Feld Beschreibung Werbereich
Calendar.YEAR Jahresfeld -
Calendar.MONTH Monatsfeld 0-11 (0 bedeutet Januar)
Calendar.DATEoderCalendar.DAY_OF_MONTH Anzahl der Tage im Monat 1-31
Calendar.DAY_OF_WEEK Wochentag 1-7 (1 bedeutet Sonntag)
Calendar.HOUR Stunde im 12-Stunden-Format 0-11
Calendar.HOUR_OF_DAY Stunde im 24-Stunden-Format 0-23
Calendar.MINUTE Minuten 0-59
Calendar.SECOND second 0-59
Calendar.MILLISECOND Millisekunden 0-999
Calendar.AM_PM AM oder PM 0 (AM) oder 1 (PM)

Methoden für Datum-Zeit-Operationen

Methode Beschreibung Beispiel
int get(int field) Wert des angegebenen Felds abrufen int year = cal.get(Calendar.YEAR)
void set(int field, int value) Wert des angegebenen Felds festlegen cal.set(Calendar.MONTH, 5)(auf Juni setzen)
void set(int year, int month, int date) Jahr, Monat, Tag festlegen cal.set(2023, 5, 15)(15. Juni 2023)
void set(int year, int month, int date, int hourOfDay, int minute) Jahr, Monat, Tag, Stunde, Minute festlegen cal.set(2023, 5, 15, 14, 30)
void set(int year, int month, int date, int hourOfDay, int minute, int second) Jahr, Monat, Tag, Stunde, Minute, Sekunde festlegen cal.set(2023, 5, 15, 14, 30, 45)
void add(int field, int amount) Die angegebene Zeitspanne addieren oder subtrahieren cal.add(Calendar.DATE, 5)(5 Tage addieren)
void roll(int field, int amount) Eine Zeitspanne addieren oder subtrahieren, ohne größere Felder zu ändern cal.roll(Calendar.DATE, 5)(ändert nur das Tagesfeld)

Methoden zum Zeitvergleich

Methode Beschreibung Beispiel
boolean after(Object when) Ermitteln, ob dieser Calendar nach der angegebenen Zeit liegt cal1.after(cal2)
boolean before(Object when) Ermitteln, ob dieser Calendar vor der angegebenen Zeit liegt cal1.before(cal2)
int compareTo(Calendar anotherCalendar) Die zeitliche Reihenfolge zweier Calendar-Objekte vergleichen cal1.compareTo(cal2)

Weitere nützliche Methoden

Methode Beschreibung Beispiel
long getTimeInMillis() Den Zeitwert dieses Calendar zurückgeben (Millisekunden) long millis = cal.getTimeInMillis()
void setTimeInMillis(long millis) Den Calendar mit dem angegebenen Millisekunden-Zeitwert setzen cal.setTimeInMillis(1626345600000L)
Date getTime() Ein Date-Objekt zurückgeben, das den Zeitwert dieses Calendar darstellt Date date = cal.getTime()
void setTime(Date date) Die Zeit des Calendar mit dem angegebenen Date setzen cal.setTime(new Date())
void clear() Alle Feldwerte löschen cal.clear()
void clear(int field) Löscht den Wert des angegebenen Felds cal.clear(Calendar.HOUR)
boolean isSet(int field) Ermittelt, ob das angegebene Feld gesetzt wurde if(cal.isSet(Calendar.YEAR))
Weitere Erweiterungen