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:
- Die meisten Methoden sind veraltet
- Unterstützt keine Internationalisierung
- 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
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
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 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
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 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
Sie können auch diegetTime()Methode, um es in ein Date-Objekt umzuwandeln:
Beispiel
Fortgeschrittene Verwendung der Calendar-Klasse
Zeitzone festlegen
Wir können eine bestimmte Zeitzone für ein Calendar-Objekt festlegen:
Beispiel
calendar.setTimeZone(timeZone);
Calendar-Feldoperationen
Die Klasse Calendar bietet dieroll()Methode, mit der ein Feld gerollt werden kann, ohne andere Felder zu beeinflussen:
Beispiel
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
Umfassendes Beispiel
Beispiel
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
Monate sind 0-basiert: In der Calendar-Klasse sind Monate 0-basiert (0=Januar, 11=Dezember), was leicht zu Fehlern führen kann.
Veränderbarkeit: Calendar-Objekte sind veränderbar; das Ändern eines Calendar-Objekts wirkt sich auf alle Stellen aus, die darauf verweisen.
Threadsicherheit: Die Calendar-Klasse ist nicht threadsicher, und in Multithread-Umgebungen ist zusätzliche Synchronisierung erforderlich.
Leistung: Häufiges Erstellen von Calendar-Instanzen beeinträchtigt die Leistung; ziehen Sie in Betracht, Instanzen wiederzuverwenden.
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
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)) |