PHPCon Poland 2024

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

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top