Signatur
Beschreibung
IntlGregorianCalendar ist eine Unterklasse von IntlCalendar und implementiert den gregorianischen Kalender, wie er in weiten Teilen der Welt als ziviler Standard verwendet wird. Die Klasse ermöglicht internationale, locale-bewusste Datums- und Zeitberechnungen, die über die einfache PHP-Funktion date() oder DateTime hinausgehen.
Im Vergleich zu IntlCalendar bietet IntlGregorianCalendar zusätzlich die Möglichkeit, den Umstellungszeitpunkt zwischen julianischem und gregorianischem Kalender (den sogenannten Gregorian Change) festzulegen und abzufragen. Außerdem kann geprüft werden, ob ein bestimmtes Jahr ein Schaltjahr (Leap Year) ist.
Typischerweise wird IntlGregorianCalendar verwendet, wenn man mit ICU-basierten Datums-/Zeit-Formatierern wie IntlDateFormatter zusammenarbeitet, oder wenn man Zeitzonen- und Kalenderberechnungen auf Basis von Locale-Einstellungen durchführen muss.
Instanzen können entweder über den Konstruktor oder über die statische Methode IntlGregorianCalendar::createInstance() erzeugt werden. Für einfache Anwendungsfälle mit dem gregorianischen Standard-Kalender ist IntlCalendar::createInstance() eine Alternative.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $timezone | IntlTimeZone|DateTimeZone|string|null | null | Die zu verwendende Zeitzone. Kann ein IntlTimeZone-Objekt, ein DateTimeZone-Objekt oder ein Zeitzonenstring (z. B. 'Europe/Berlin') sein. Bei null wird die Standard-Zeitzone verwendet. |
| $locale | string|null | null | Das Locale als BCP-47-String (z. B. 'de_DE'). Bei null wird das Standard-Locale aus der INI-Einstellung intl.default_locale verwendet. |
Rückgabewert
Beispiele
Gregorianischen Kalender erstellen und aktuelles Datum abfragen
<?php
$cal = new IntlGregorianCalendar(IntlTimeZone::createTimeZone('Europe/Berlin'), 'de_DE');
// Aktuelles Jahr, Monat und Tag ausgeben
$year = $cal->get(IntlCalendar::FIELD_YEAR);
$month = $cal->get(IntlCalendar::FIELD_MONTH) + 1; // Monate sind 0-basiert
$day = $cal->get(IntlCalendar::FIELD_DAY_OF_MONTH);
echo "Aktuelles Datum (gregorianisch): {$day}.{$month}.{$year}\n";
Schaltjahr prüfen und Gregorian Change auslesen
<?php
$cal = new IntlGregorianCalendar();
// Schaltjahre prüfen
foreach ([2000, 1900, 2024, 2023] as $year) {
$isLeap = $cal->isLeapYear($year);
echo "{$year} ist " . ($isLeap ? '' : 'kein ') . "Schaltjahr.\n";
}
// Umstellungspunkt vom julianischen auf den gregorianischen Kalender
$changeDate = $cal->getGregorianChange();
echo "Gregorian Change (Unix-Timestamp): " . $changeDate . "\n";
// Eigenen Gregorian Change setzen (historische Simulation)
$cal->setGregorianChange(PHP_INT_MIN); // Immer gregorianisch
echo "Neuer Gregorian Change: " . $cal->getGregorianChange() . "\n";
Zusammenarbeit mit IntlDateFormatter
<?php
$cal = new IntlGregorianCalendar(IntlTimeZone::createTimeZone('Europe/Berlin'), 'de_DE');
$cal->set(2025, 0, 1); // 1. Januar 2025 (Monate 0-basiert)
$formatter = new IntlDateFormatter(
'de_DE',
IntlDateFormatter::LONG,
IntlDateFormatter::NONE,
'Europe/Berlin',
IntlDateFormatter::GREGORIAN
);
echo $formatter->formatObject($cal) . "\n";
// Wichtig · Fallstricke
Monate sind 0-basiert: In IntlCalendar und damit auch in IntlGregorianCalendar beginnen die Monate bei 0 (Januar = 0, Dezember = 11). Das führt häufig zu Off-by-one-Fehlern, wenn man Werte aus PHP-DateTime direkt überträgt.
Gregorian Change: Standardmäßig ist der Umstellungspunkt auf den 15. Oktober 1582 gesetzt. Mit setGregorianChange() kann dieser geändert werden, z. B. für historische Simulationen. Das Setzen auf PHP_INT_MIN erzwingt immer den gregorianischen Kalender.
Erweiterung erforderlich: Die intl-Erweiterung muss in PHP aktiviert sein (meistens via extension=intl in der php.ini). Die ICU-Bibliotheksversion beeinflusst das Verhalten bei historischen Daten und Lokalisierungen.