## Rechnen mit Datum und Uhrzeit

Die folgenden Beispiele zeigen einige Fallstricke beim Rechnen mit Datum und Uhrzeit bezüglich der Sommerzeitumstellungen sowie der Monate mit unterschiedlicher Anzahl von Tagen.

Beispiel #1 DateTimeImmutable::add/sub addiert Intervalle, die die verstrichene Zeit umfassen

Wenn PT24H über den Zeitpunkt einer Sommerzeitumstellung hinzugefügt wird, scheinen 23/25 Stunden hinzugefügt zu werden (bei den meisten Zeitzonen).

`<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Beginn: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->add(new DateInterval("PT3H"));
echo "Ende: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    Beginn: 2015-11-01 00:00:00 -04:00
    Ende:   2015-11-01 02:00:00 -05:00

Beispiel #2 DateTimeImmutable::modify und strtotime erhöhen oder verringern die Werte einzelner Komponenten

Wenn +24 Stunden über den Zeitpunkt einer Sommerzeitumstellung hinzugefügt werden, werden genau 24 Stunden hinzugefügt, wie sie in der Datum/Zeit-Zeichenkette zu sehen sind (es sei denn, die Anfangs- oder Endzeit liegt auf einem Übergangspunkt).

`<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Beginn: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+24 hours");
echo "Ende: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    Beginn: 2015-11-01 00:00:00 -04:00
    Ende:   2015-11-02 00:00:00 -05:00

Beispiel #3 Durch die Addition oder Subtraktion von Zeiten kann das Datum über- oder unterschritten werden

Zum Beispiel ergibt der 31. Januar + 1 Monat den 2. März (Schaltjahr) oder den 3. März (normales Jahr).

`<?php
echo "Normales Jahr:\n"; // Februar hat 28 Tage
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Beginn: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Ende: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Schaltjahr:\n"; // Februar hat 29 Tage
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Beginn: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Ende: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    Normales Jahr:
    Beginn: 2015-01-31 00:00:00 -05:00
    Ende:   2015-03-03 00:00:00 -05:00
    Schaltjahr:
    Beginn: 2016-01-31 00:00:00 -05:00
    Ende:   2016-03-02 00:00:00 -05:00

Um den letzten Tag des nächsten Monats zu erhalten (d. h. um den Überlauf zu verhindern), gibt es das Format `last day of`.

`<?php
echo "Normales Jahr:\n"; // Februar hat 28 Tage
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Beginn: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Ende: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Schaltjahr:\n"; // Februar hat 29 Tage
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Beginn: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Ende: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    Normales Jahr:
    Beginn: 2015-01-31 00:00:00 -05:00
    Ende:   2015-02-28 00:00:00 -05:00
    Schaltjahr:
    Beginn: 2016-01-31 00:00:00 -05:00
    Ende:   2016-02-29 00:00:00 -05:00

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open