<?php
Header 
('Content-Type: text/html; charset=UTF-8');
// show source
highlight_file (__FILE__false);

echo 
"<hr />\n";

// einbinden des projekts
require_once 'CXDate.php';

// Informationen vom Datum abfragen:
function infosUeberDatum ($title$date) {
    echo 
"<div style=\"border: 1px solid red; margin: 5px; padding: 2px;\">\n";
    echo 
"<h1 style=\"margin: 1px\">".$title."</h1>\n";
    echo 
"Jahr: ".$date->year ()."<br />\n";
    echo 
"Monat: ".$date->month ()."<br />\n";
    echo 
"Tag: ".$date->day ()."<br />\n";
    echo 
"Stunde: ".$date->hour ()."<br />\n";
    echo 
"Minute: ".$date->minute ()."<br />\n";
    echo 
"Sekunde: ".$date->second ()."<br />\n";
    echo 
"Mikrosekunde: ".$date->msec ()."<br />\n";
    echo 
"Wochentag (0 = Montag): ".$date->weekDay ()."<br />\n";
    echo 
"Tag im Jahr: ".$date->yearDay ()."<br />\n";
    if (
$date->isDst ()) {
        echo 
"Sommerzeit.<br />\n";
    } else {
        echo 
"Keine Sommerzeit.<br />\n";
    }
    if (
$date->isDstUnique ()) {
        echo 
"Zeitangabe ist eindeutig.<br />\n";
    } else {
        echo 
"Zeitangabe ist nicht eindeutig.<br />\n";
        if (
$date->usesPrevTransition ()) {
            echo 
"  [Erste Zeit]<br />\n";
        } else {
            echo 
"  [Zweite Zeit]<br />\n";
        }
    }
    echo 
"Offset von UTC in Sekunden: " $date->UTCOffset ()."<br />\n";
    echo 
"Zeitzonen-Abkürzung: " $date->tzAbbreviation ()."<br />\n";
    echo 
"Formatierte Ausgabe: " $date->format ("%Y-%m-%d %T%z [%A, %a, %B, %b]")."<br />\n";
    echo 
"Diskrete julianische Tageszahl: " $date->jddn () . "<br / >\n";
    echo 
"<hr />\n";
    echo 
"<strong>Datum in UTC:</strong><br />\n";
    echo 
"Jahr: ".$date->year (true)."<br />\n";
    echo 
"Monat: ".$date->month (true)."<br />\n";
    echo 
"Tag: ".$date->day (true)."<br />\n";
    echo 
"Stunde: ".$date->hour (true)."<br />\n";
    echo 
"Minute: ".$date->minute (true)."<br />\n";
    echo 
"Sekunde: ".$date->second (true)."<br />\n";
    echo 
"Mikrosekunde: ".$date->msec (true)."<br />\n";
    echo 
"Wochentag (0 = Montag): ".$date->weekDay (true)."<br />\n";
    echo 
"Tag im Jahr: ".$date->yearDay (true)."<br />\n";
    echo 
"Formatierte Ausgabe: " $date->format ("%Y-%m-%d %T%z [%A, %a, %B, %b]"nullfalsetrue)."<br />\n";
    echo 
"Diskrete julianische Tageszahl: " $date->jddn (true) . "<br / >\n";
    echo 
"</div>\n";
}

// ein neues Datumsobjekt erstellen
// Der erste Parameter ist ein assoziatives Array mit Optionen, es können
// einzelne weggelassen werden (oder der ganze Parameter) - dann werden
// Default-Werte verwendet
// Mögliche Werte:
//   'timeZone': Die Zeitzone des Datums. Wenn nicht angegeben, wird versucht,
//               die System-Zeitzone so gut wie möglich zu raten (unter Windows
//               funktioniert das aktuell nur bedingt, da fehlt noch Code)
//               Möglich ist eine Angabe wie 'Europe/Berlin' als Referenz auf
//               die Zeitzonen-Datenbank oder eine Angabe nach dem POSIX-
//               Standard wie CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00 sein
//               oder aber auch schlichtweg eine Zahl, die den Offset von UTC
//               in Sekunden angibt
//   'calendar': Der Kalender, der zu verwenden ist; Standardeinstellung ist
//               CXDATE_CAL_GJAUTO. Mögliche Werte sind:
//                 - CXDATE_CAL_JULIAN: Julianischer Kalender, wie er bis
//                                      zur Kalenderreform unter Papst Gregor
//                                      in Europa in Verwendung war.
//                 - CXDATE_CAL_GREGORIAN: Gregorianischer Kalender (unser
//                                         jetztiger Kalender), erlaubt aber nur
//                                         Daten ab dem 15.10.1582 (Inkraft-
//                                         treten der Kalenderreform)
//                 - CXDATE_CAL_GJAUTO: Automatische Auswahl zwischen
//                                      julianischem und gregorianischem
//                                      Kalender (vor dem 15.10.1582 julianisch,
//                                      danach gregorianisch).
//                 - CXDATE_CAL_ISO8601: ISO 8601 definiert als Kalender den
//                                       gregorianischen Kalender - allerdings
//                                       auch proleptisch, d.h. vor 
//                 - evlt. weitere wenn Plugins geladen sind
//   'leapSecondsMode': Der Modus, wie Schaltsekunden zu behandeln sind:
//                         - CXDATE_LEAPSEC_IGNORE: Schaltsekunden komplett
//                                                  ignorieren.
//                         - CXDATE_LEAPSEC_STD: Bei normalen Berechnungen
//                                               Schaltsekunden berücksichtigen,
//                                               bei POSIX-Timestamps jedoch
//                                               nicht.
//                         - CXDATE_LEAPSEC_ALWAYS: Immer Schaltsekunden
//                                                  berücksichtigen (verletzt
//                                                  den POSIX-Standard und ist
//                                                  inkompatibel mit so ziemlich
//                                                  jeder anderen Applikation,
//                                                  die Timestamps erzeugt)
$date = new CXDate (array (
    
'timeZone' => 'Europe/Berlin',
    
'calendar' => CXDATE_CAL_ISO8601,
    
'leapSecondsMode' => CXDATE_LEAPSEC_IGNORE
));

// Aktuelles Datum setzen
// (wenn erster Parameter true ist, werden Mikrosekunden berücksichtigt)
$res $date->setCurrentDate (false);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen des aktuellen Datums<br />\n";
} else {
    
infosUeberDatum ("Aktuelles Datum (I)"$date);
}

// Kurzform für obiges
$curDate CXDate::currentDate (false, array (
    
'timeZone' => 'Europe/Berlin',
    
'calendar' => CXDATE_CAL_ISO8601,
    
'leapSecondsMode' => CXDATE_LEAPSEC_IGNORE
));
if (
$curDate === false || CXDate_Helpers::isError ($curDate)) {
    echo 
"Fehler beim Holen des aktuellen Datums<br />\n";
} else {
    
infosUeberDatum ("Aktuelles Datum (II)"$curDate);
}

// Ein bestimmtes Datum setzen
// Dies würde den 3. Mai 2006 um 15:22:16 und 250 Millisekunden setzen
// Die letzten 3 Parameter:
//    -1: Wenn das Datum nicht eindeutig wäre in der Zeitzone: Fehler
//        zurückgeben (true würde dazu führen, dass die erste Zeit genommen
//        wird, false, dass die zweite genommen wird)
//    false: Abbrechen, falls das Datum nicht erlaubt wäre in der aktuellen
//           Zeitzone (true würde heißen, es trotzdem setzen zu lassen, was
//           dazu führt, dass etwas anderes (Abweichung meistens eine Stunde)
//           dabei rauskommt (ist ziemlich kompliziert, das nur in ein paar
//           Sätzen zu erklären))
//    false: Das angegebene Datum ist Lokalzeit (true würde heißen, das Datum
//           wäre UTC)
$res $date->setDateSpec (200653152216250000, -1falsefalse);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen des bestimmten Datums<br />\n";
} else {
    
infosUeberDatum ("Bestimmtes Datum"$date);
}

// Eine nichteindeutige Zeitangabe setzen
$res $date->setDateSpec (2006102923000, -1falsefalse);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    
// ES SOLL FEHLSCHLAGEN!
    
echo "Fehler beim Setzen der nichteindeutigen Zeitangabe<br />\n";
} else {
    
infosUeberDatum ("Nichteindeutige Zeitangabe"$date);
}

// Zeitangabe eindeutig machen
$res $date->setDateSpec (2006102923000truefalsefalse);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen der eindeutig gemachten Zeitangabe<br />\n";
} else {
    
infosUeberDatum ("Nichteindeutige Zeitangabe (II)"$date);
}

// ne stunde addieren
$res $date->increaseBy (new CXDate_Interval (036000));
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Erhöhen um eine Stunde<br />\n";
} else {
    
infosUeberDatum ("Nichteindeutige Zeitangabe (III)"$date);
}

// Einen POSIX-Timestamp setzen
$res $date->setPOSIXTimeStamp (1058769744);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen des Timestamps<br />\n";
} else {
    
infosUeberDatum ("Timestamp"$date);
}

// Zeitzone ändern
$res $date->setTimeZone ('Europe/London');
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen der Zeitzone<br />\n";
} else {
    
infosUeberDatum ("Zeitzone -> Konvertieren"$date);
}

// Zeitzone ändern, dabei das Datum nicht konvertieren
$res $date->setTimeZone ('Europe/Berlin'false);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen der Zeitzone (II)<br />\n";
} else {
    
infosUeberDatum ("Zeitzone -> nicht konvertieren"$date);
}

// Intervall von 2 Tagen und 3600 Sekunden erzeugen
// (Achtung: 1 Tag heißt bei Intervallen immer 86400 Sekunden, unabhängig davon,
// ob der Tag nicht doch 86401 Sekunden hat (Schaltsekunde)! Wenn man also
// ein Intervall der Länge 1 Tags auf 1972-06-31 00:30:00 +01:00 addiert, erhält
// man 1972-07-01 00:29:59 +01:00, außer, man schaltet
// Schaltsekundenunterstützung ab)
$iv = new CXDate_Interval (236000);

// Addiere das Intevall auf das datum
$res $date->increaseBy ($iv);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen der Zeitzone (II)<br />\n";
} else {
    
infosUeberDatum ("Datum: 2 * 86400 + 3600 Sekunden addiert"$date);
}


// aktuelles datum, Hebräischer Kalender
// (Hinweis: der hebräische Tag fängt um 18:00 des Vortages an, daher nicht
// wundern, dass die Zeitangabe anders als erwartet ist oder nach 18:00 schon
// das Datum von morgen angezeigt wird)
require_once 'CXDate/Calendar/Hebrew.php';

$curDate CXDate::currentDate (false, array (
    
'timeZone' => 'Europe/Berlin',
    
'calendar' => CXDATE_CAL_HEBREW,
    
'leapSecondsMode' => CXDATE_LEAPSEC_IGNORE
));
if (
$curDate === false || CXDate_Helpers::isError ($curDate)) {
    echo 
"Fehler beim Holen des aktuellen Datums<br />\n";
} else {
    
// hier wird das Formatieren nicht klappen, da das Default-Locale
    // keinen hebräischen Kalender unterstüzt (und Tishri ist nunmal nicht
    // Juli).
    
infosUeberDatum ("Aktuelles Datum, Hebräischer Kalender"$curDate);
}

// Datum einer Schaltsekunde setzen
$date = new CXDate (array (
    
'timeZone' => 'Europe/Berlin',
    
'calendar' => CXDATE_CAL_ISO8601,
    
'leapSecondsMode' => CXDATE_LEAPSEC_STD
));

$res $date->setDateSpec (200611059600, -1falsefalse);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen der Schaltsekunde<br />\n";
} else {
    
infosUeberDatum ("Schaltsekunde"$date);
}

// etwas später setzen um zu zeigen, dass das kein Trick ist
$res $date->setDateSpec (200611159600, -1falsefalse);
if (
$res === false || CXDate_Helpers::isError ($res)) {
    echo 
"Fehler beim Setzen der Nicht-Schaltsekunde<br />\n";
} else {
    
infosUeberDatum ("Keine Schaltsekunde"$date);
}
?>

Aktuelles Datum (I)

Jahr: 2025
Monat: 10
Tag: 11
Stunde: 8
Minute: 43
Sekunde: 44
Mikrosekunde: 0
Wochentag (0 = Montag): 5
Tag im Jahr: 284
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe: 2025-10-11 08:43:44+0200 [Saturday, Sat, October, Oct]
Diskrete julianische Tageszahl: 2460960

Datum in UTC:
Jahr: 2025
Monat: 10
Tag: 11
Stunde: 6
Minute: 43
Sekunde: 44
Mikrosekunde: 0
Wochentag (0 = Montag): 5
Tag im Jahr: 284
Formatierte Ausgabe: 2025-10-11 06:43:44+0000 [Saturday, Sat, October, Oct]
Diskrete julianische Tageszahl: 2460960

Aktuelles Datum (II)

Jahr: 2025
Monat: 10
Tag: 11
Stunde: 8
Minute: 43
Sekunde: 44
Mikrosekunde: 0
Wochentag (0 = Montag): 5
Tag im Jahr: 284
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe: 2025-10-11 08:43:44+0200 [Saturday, Sat, October, Oct]
Diskrete julianische Tageszahl: 2460960

Datum in UTC:
Jahr: 2025
Monat: 10
Tag: 11
Stunde: 6
Minute: 43
Sekunde: 44
Mikrosekunde: 0
Wochentag (0 = Montag): 5
Tag im Jahr: 284
Formatierte Ausgabe: 2025-10-11 06:43:44+0000 [Saturday, Sat, October, Oct]
Diskrete julianische Tageszahl: 2460960

Bestimmtes Datum

Jahr: 2006
Monat: 5
Tag: 3
Stunde: 15
Minute: 22
Sekunde: 16
Mikrosekunde: 250000
Wochentag (0 = Montag): 2
Tag im Jahr: 123
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe: 2006-05-03 15:22:16+0200 [Wednesday, Wed, May, May]
Diskrete julianische Tageszahl: 2453859

Datum in UTC:
Jahr: 2006
Monat: 5
Tag: 3
Stunde: 13
Minute: 22
Sekunde: 16
Mikrosekunde: 250000
Wochentag (0 = Montag): 2
Tag im Jahr: 123
Formatierte Ausgabe: 2006-05-03 13:22:16+0000 [Wednesday, Wed, May, May]
Diskrete julianische Tageszahl: 2453859
Fehler beim Setzen der nichteindeutigen Zeitangabe

Nichteindeutige Zeitangabe (II)

Jahr: 2006
Monat: 10
Tag: 29
Stunde: 2
Minute: 30
Sekunde: 0
Mikrosekunde: 0
Wochentag (0 = Montag): 6
Tag im Jahr: 302
Sommerzeit.
Zeitangabe ist nicht eindeutig.
[Erste Zeit]
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe: 2006-10-29 02:30:00+0200 [Sunday, Sun, October, Oct]
Diskrete julianische Tageszahl: 2454038

Datum in UTC:
Jahr: 2006
Monat: 10
Tag: 29
Stunde: 0
Minute: 30
Sekunde: 0
Mikrosekunde: 0
Wochentag (0 = Montag): 6
Tag im Jahr: 302
Formatierte Ausgabe: 2006-10-29 00:30:00+0000 [Sunday, Sun, October, Oct]
Diskrete julianische Tageszahl: 2454038

Nichteindeutige Zeitangabe (III)

Jahr: 2006
Monat: 10
Tag: 29
Stunde: 2
Minute: 30
Sekunde: 0
Mikrosekunde: 0
Wochentag (0 = Montag): 6
Tag im Jahr: 302
Keine Sommerzeit.
Zeitangabe ist nicht eindeutig.
[Zweite Zeit]
Offset von UTC in Sekunden: 3600
Zeitzonen-Abkürzung: CET
Formatierte Ausgabe: 2006-10-29 02:30:00+0100 [Sunday, Sun, October, Oct]
Diskrete julianische Tageszahl: 2454038

Datum in UTC:
Jahr: 2006
Monat: 10
Tag: 29
Stunde: 1
Minute: 30
Sekunde: 0
Mikrosekunde: 0
Wochentag (0 = Montag): 6
Tag im Jahr: 302
Formatierte Ausgabe: 2006-10-29 01:30:00+0000 [Sunday, Sun, October, Oct]
Diskrete julianische Tageszahl: 2454038

Timestamp

Jahr: 2003
Monat: 7
Tag: 21
Stunde: 8
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 0
Tag im Jahr: 202
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe: 2003-07-21 08:42:24+0200 [Monday, Mon, July, Jul]
Diskrete julianische Tageszahl: 2452842

Datum in UTC:
Jahr: 2003
Monat: 7
Tag: 21
Stunde: 6
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 0
Tag im Jahr: 202
Formatierte Ausgabe: 2003-07-21 06:42:24+0000 [Monday, Mon, July, Jul]
Diskrete julianische Tageszahl: 2452842

Zeitzone -> Konvertieren

Jahr: 2003
Monat: 7
Tag: 21
Stunde: 7
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 0
Tag im Jahr: 202
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 3600
Zeitzonen-Abkürzung: BST
Formatierte Ausgabe: 2003-07-21 07:42:24+0100 [Monday, Mon, July, Jul]
Diskrete julianische Tageszahl: 2452842

Datum in UTC:
Jahr: 2003
Monat: 7
Tag: 21
Stunde: 6
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 0
Tag im Jahr: 202
Formatierte Ausgabe: 2003-07-21 06:42:24+0000 [Monday, Mon, July, Jul]
Diskrete julianische Tageszahl: 2452842

Zeitzone -> nicht konvertieren

Jahr: 2003
Monat: 7
Tag: 21
Stunde: 7
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 0
Tag im Jahr: 202
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe: 2003-07-21 07:42:24+0200 [Monday, Mon, July, Jul]
Diskrete julianische Tageszahl: 2452842

Datum in UTC:
Jahr: 2003
Monat: 7
Tag: 21
Stunde: 5
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 0
Tag im Jahr: 202
Formatierte Ausgabe: 2003-07-21 05:42:24+0000 [Monday, Mon, July, Jul]
Diskrete julianische Tageszahl: 2452842

Datum: 2 * 86400 + 3600 Sekunden addiert

Jahr: 2003
Monat: 7
Tag: 23
Stunde: 8
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 2
Tag im Jahr: 204
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe: 2003-07-23 08:42:24+0200 [Wednesday, Wed, July, Jul]
Diskrete julianische Tageszahl: 2452844

Datum in UTC:
Jahr: 2003
Monat: 7
Tag: 23
Stunde: 6
Minute: 42
Sekunde: 24
Mikrosekunde: 0
Wochentag (0 = Montag): 2
Tag im Jahr: 204
Formatierte Ausgabe: 2003-07-23 06:42:24+0000 [Wednesday, Wed, July, Jul]
Diskrete julianische Tageszahl: 2452844

Aktuelles Datum, Hebräischer Kalender

Jahr: 5786
Monat: 7
Tag: 19
Stunde: 14
Minute: 43
Sekunde: 44
Mikrosekunde: 0
Wochentag (0 = Montag): 5
Tag im Jahr: 19
Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 7200
Zeitzonen-Abkürzung: CEST
Formatierte Ausgabe:
Diskrete julianische Tageszahl: 2460960

Datum in UTC:
Jahr: 5786
Monat: 7
Tag: 19
Stunde: 12
Minute: 43
Sekunde: 44
Mikrosekunde: 0
Wochentag (0 = Montag): 5
Tag im Jahr: 19
Formatierte Ausgabe:
Diskrete julianische Tageszahl: 2460960

Schaltsekunde

Jahr: 2006
Monat: 1
Tag: 1
Stunde: 0
Minute: 59
Sekunde: 60
Mikrosekunde: 0
Wochentag (0 = Montag): 6
Tag im Jahr: 1
Keine Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 3600
Zeitzonen-Abkürzung: CET
Formatierte Ausgabe: 2006-01-01 00:59:60+0100 [Sunday, Sun, January, Jan]
Diskrete julianische Tageszahl: 2453737

Datum in UTC:
Jahr: 2005
Monat: 12
Tag: 31
Stunde: 23
Minute: 59
Sekunde: 60
Mikrosekunde: 0
Wochentag (0 = Montag): 5
Tag im Jahr: 365
Formatierte Ausgabe: 2005-12-31 23:59:60+0000 [Saturday, Sat, December, Dec]
Diskrete julianische Tageszahl: 2453736

Keine Schaltsekunde

Jahr: 2006
Monat: 1
Tag: 1
Stunde: 2
Minute: 0
Sekunde: 0
Mikrosekunde: 0
Wochentag (0 = Montag): 6
Tag im Jahr: 1
Keine Sommerzeit.
Zeitangabe ist eindeutig.
Offset von UTC in Sekunden: 3600
Zeitzonen-Abkürzung: CET
Formatierte Ausgabe: 2006-01-01 02:00:00+0100 [Sunday, Sun, January, Jan]
Diskrete julianische Tageszahl: 2453737

Datum in UTC:
Jahr: 2006
Monat: 1
Tag: 1
Stunde: 1
Minute: 0
Sekunde: 0
Mikrosekunde: 0
Wochentag (0 = Montag): 6
Tag im Jahr: 1
Formatierte Ausgabe: 2006-01-01 01:00:00+0000 [Sunday, Sun, January, Jan]
Diskrete julianische Tageszahl: 2453737