Tach!
Um von einem Tag zum nächsten zu kommen, habe ich auf den Tag einfach 86400 Sekunden drauf gezählt, also ein Tag.
Klappt an 364 Tagen auch wunderbar, wenn da die doofe Zeitumstellung im Oktober nicht wäre. Da sind es kein 86400 Sekunden zum nächsten Tag, sondern 3600 Sekunden mehr. Es wird uns eine Stunde geschenkt. Ergo gibt mein Kalender zwei mal den 27 Oktober aus (Dieses Jahr).
Das es im März auch eine Zeitumstellung gibt ist mir druchaus bewußt. Dort würde sich die Zeit ein wenig verschieben, aber der Tag würde noch passen, was mir aktuell recht ist.
Und im Oktober verschiebt es sich wieder zurück. Wenn du während der Sommerzeit die eine Stunde berücksichtigen würdest, wäre alles in Butter. Ebenso, wenn du statt 0 Uhr mit 12 Uhr rechen würdest. Dann ist es zur anderen Zeitzone mit der einen Stunde Verschiebung immer noch derselbe Tag.
Da dies ein generelles Problem ist, würde ich gerne wissen ob man bei PHP die automatische Zeitumstellungserkennung irgendwie deaktivieren könnte?
Modernes PHP kann mit vielen Zeitzonen arbeiten. Gibst du keine an, nimmt es die Lokalzeit. Das ist die, die auf dem System eingestellt ist. Wenn du also Zeitumstellung verhindern möchtest, müsstest du in dein darunterliegendes System eingreifen. Keine besonders gute Idee. Du kannst zwar generell auf UTC stellen, was auch auf manchen Systemen so gehandhabt wird (vom Admin, nicht vom System selbst). Dann hast du aber immer eine permanente Zeitverschiebung von 1 oder 2 Stunden zu berücksichtigen, wenn du in Lokalzeit ausgeben willst.
Beim Rechnen mit der Zeit ist es besser, PHP sich kümmern zu lassen, wie lange ein Tag ist. strtotime('+1day', $timestamp) liefert den nächsten Tag, inklusive der Zeitumstellungsberücksichtigung.
Auch das bereits genannte DateTime::add() liefert beim Addieren von Tagen ein passendes Ergebnis. Aber es irritiert mich, wenn man mit anderen Werten rechnet.
[code lang=php]$interval = 'P1D';
$date = new DateTime('2013-03-31 00:00:00', new DateTimeZone('Europe/Berlin'));
echo $date->format("r\n");
$date->add(new DateInterval($interval));
echo $date->format("r\n");
Die letzten beiden Zeilen bitte ein paar mal wiederholen. - Mit diesen Ausgangswerten gibt es korrekt
Sun, 31 Mar 2013 00:00:00 +0100
Mon, 01 Apr 2013 00:00:00 +0200
Aber dasselbe Ergebnis kommt bei einem Intervall von PT86400S, und das ist meiner Ansicht nach falsch.
Nehmen wir nun als Startzeitpunkt 2013-03-31 01:00:00 und als Intervall PT30M (30 Minuten) ergibt das:
Sun, 31 Mar 2013 01:00:00 +0100
Sun, 31 Mar 2013 01:30:00 +0100
Sun, 31 Mar 2013 03:00:00 +0200
Sun, 31 Mar 2013 03:30:00 +0200
Soweit korrekt, 2 Uhr gibt es nicht, das wird zu 3 Uhr. Und nun zum Oktober 2013-10-27 01:00:00, Intervall bleibt bei 30 Minuten.
Sun, 27 Oct 2013 01:00:00 +0200
Sun, 27 Oct 2013 01:30:00 +0200
Sun, 27 Oct 2013 02:00:00 +0100
Sun, 27 Oct 2013 02:30:00 +0100
Sun, 27 Oct 2013 03:00:00 +0100
Sun, 27 Oct 2013 03:30:00 +0100
Wo ist die "geschenkte" Stunde hin? Die Umstellung erfolgt erst um 03:00 +0200 auf 02:00 +0100. Da fehlen mir die Zeiten 02:00 +0200 und 02:30 +0200.
dedlfix.