Zeitzone mit DST-Behandlung durch PHP

Lesezeit: 5 Minuten

Benutzeravatar von Krishna Shetty
Krishna Shetty

Ich arbeite an einer Kalenderanwendung. In diesem können Benutzer aus verschiedenen Zeitzonen Ereignisse erstellen/ansehen. Ich denke daran, die folgende Methode zu befolgen, um die Ereigniszeit in UTC zu speichern und sie in der Ortszeit des Benutzers anzuzeigen. Hinweis: Der Benutzer hat seine bevorzugte Zeitzoneneinstellung.

So speichern Sie die Startzeit des Ereignisses als UTC-Zeitstempel:

$timezone = new DateTimeZone( $user_timezone_name );
$utcOffset = $timezone->getOffset( new DateTime( $event_start_time_string_local ) );
$event_start_timestamp_local = maketime( $event_start_time_string_local );
//Now add/subtract $utcOffset to/from $event_start_timestamp_local to get event's start  //time  timestamp in UTC and save this result in DB.

So erhalten Sie die Startzeit des Ereignisses in der Zeitzone des Benutzers:

date_default_timezone_set( $user_timezone_name );
$eventTimeLocalTime = date("Y-m-d H:i:s", $event_start_timestamp_in_UTC );

Wo:

user_timezone_name is user's timezone setting.
event_start_time_string_local is event's start time string in local/civil time.
event_start_timestamp_in_UTC is event's start time timestamp in UTC.

Meine Fragen:

  • Ob die oben verwendeten PHP-APIs die Sommerzeit für alle Regionen übernehmen?
  • Die Sommerzeit selbst ändert sich in verschiedenen Jahren, wie erhält PHP Informationen darüber? Müssen wir PHP aktualisieren? Wenn ja, müssen wir die gesamte oder eine bestimmte PHP-Bibliothek aktualisieren?

Referenzen: – macht-phps-date-default-timezone-set-adjust-to-daylight-saving – get-timezone-offset-for-a-gegeben-location

Benutzeravatar von deceze
verzeihen

Du verkomplizierst das viel zu sehr. So konvertieren Sie zwischen zwei Zeitzonen mit DateTimemach das:

date_default_timezone_set('Asia/Kolkata'); // YOUR timezone, of the server

$date = new DateTime($input, new DateTimeZone('Asia/Tokyo')); // USER's timezone
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s');

Dadurch wird die lokale Zeitzone eines Benutzers in UTC konvertiert. Um den umgekehrten Weg zu gehen und die Uhrzeit in der Ortszeit des Benutzers anzuzeigen, tauschen Sie die beiden Zeitzonen aus.

Ja, PHP kümmert sich um die Sommerzeit. Die notwendigen Konvertierungsregeln sind Bestandteil der PHP-Installation. Sie können sie auf dem neuesten Stand halten, indem Sie PHP oder die aktualisieren Zeitzonendb.

  • Die Aktualisierung der Zeitzonendatenbank ist eine regelmäßige Aufgabe, die mehrmals im Jahr erforderlich ist, da jedes Mal, wenn ein Land eine Änderung vornimmt, eine Aktualisierung erfolgt – und dies geschieht ziemlich häufig.

    – Sven

    4. Dezember 2012 um 8:42 Uhr

  • Warum müssen wir am Anfang ‘date_default_timezone_set(‘Asia/Kolkata’)’ aufrufen?

    – Krishna Shetty

    4. Dezember 2012 um 13:38 Uhr


  • Sie können verwenden '@12345...' für UNIX-Zeitstempel.

    – verzeihen

    4. Dezember 2012 um 14:14 Uhr

  • @Krishna Ein UNIX-Zeitstempel ist definiert als Sekunden seit 1970 UTC. Der Zeitstempel ist zeitzonenfrei, aber wenn überhaupt, ist es UTC. Sie können wie oben gezeigt in eine „Ortszeit“ formatieren.

    – verzeihen

    5. Dezember 2012 um 7:33 Uhr


  • @deceze Ein UNIX-Zeitstempel ist definiert als die Anzahl von “UNIX Sekunden” seit der Epoche. UNIX-Sekunden != si Sekunden, da Unix-Sekunden Schaltsekunden enthalten und dazu führen, dass ALLE Tage GENAU 86400 Sekunden lang sind, anstatt durchschnittlich 86400,002 Sekunden lang. Eine Folge davon ist, dass der Moment einer Schaltsekunde nicht sein kann in einem Unix-Zeitstempel dargestellt, da sie in Unix-Zeitstempeln nicht existieren.

    – Benutzer3338098

    11. November 2020 um 23:17 Uhr


Ja, die PHP-API berücksichtigt die Sommerzeit. Die meiste Zeit können Sie die Zeitumrechnung sicher durchführen, wie es deceze gezeigt hat. Das Problem ist, dass es nicht immer möglich/machbar oder sinnvoll ist. Betrachten Sie das folgende Beispiel: In Polen (2013) wird Ihre Uhr am 27. Oktober um 3 Uhr morgens um eine Stunde zurückgestellt, um auf Standardzeit (Offset UTC+01:00) umzuschalten. Am 31. März um 2 Uhr morgens wird die Uhr um 1 Stunde vorgestellt, um auf Sommer umzuschalten Zeit (Offset UTC+02:00). Sehen wir uns nun an, wie „Echtzeit“ in Grenwich/UTC tickt und wie die Konvertierung per PHP von Europa/Warschau nach UTC funktioniert:

Europe/Warsaw time   offset  UTC                    php2utc conversion   php offset
2013-10-27 01:00:00    +2    2013-10-26 23:00:00    2013-10-26 23:00:00  +2
2013-10-27 01:30:00    +2    2013-10-26 23:30:00    2013-10-26 23:30:00  +2
2013-10-27 02:00:00    +2    2013-10-27 00:00:00    2013-10-27 01:00:00  +1  *
2013-10-27 02:30:00    +2    2013-10-27 00:30:00    2013-10-27 01:30:00  +1  *
2013-10-27 02:59:00    +2    2013-10-27 00:59:00    2013-10-27 01:59:00  +1  *
     3am -> 2am .....................................summer time changes to standard(winter) time @3am we subtract 1h so 3am becomes 2am
2013-10-27 02:00:00    +1    2013-10-27 01:00:00    2013-10-27 01:00:00  +1
2013-10-27 02:30:00    +1    2013-10-27 01:30:00    2013-10-27 01:30:00  +1
2013-10-27 03:00:00    +1    2013-10-27 02:00:00    2013-10-27 02:00:00  +1  
2013-10-27 03:30:00    +1    2013-10-27 02:30:00    2013-10-27 02:30:00  +1  

Wie Sie zwischen 2:00 und 3:00 Uhr sehen können, kann PHP auf keinen Fall wissen, „welche“ Stunde (von vor / nach der Anpassung) es ist, daher kann es nicht zuverlässig konvertieren. Hoffe, das hilft jemandem bei seinen Überlegungen 😉

  • Das ist genau das Problem, für das ich versuche, einen Komponententest zu schreiben. Vermutlich enthält das DateTimeZone-Objekt die DST-Änderung. Wie kann ich es auf die eine oder andere Weise erzwingen? Gibt es eine gewisse Konsistenz (wenn ich z. B. eine Zeit in der Stunde angebe, wird immer die DST-Zeit gewählt), auch was ist mit der fehlenden Stunde. Im obigen Beispiel gibt es keine Ortszeit, 31. März 2:30 Uhr in Polen (das wäre 3:30 Uhr UTC+2). Vermutlich gibt es irgendwo eine detaillierte Spezifikation dafür. Irgendeine Idee wo?

    – sibaz

    8. Juli 2019 um 10:57 Uhr

  • Danke für diese Tabelle. Innerhalb dieser einen problematischen Stunde kann man die MESZ-Werte nicht eingeben, da sie immer als MEZ behandelt werden. Auch wenn die MESZ-Zeitzone explizit angegeben ist. Ich habe das gelöst, indem ich die DST-Änderung erkannt habe (mit format('I')) und in diesem Fall erstelle ich eine DateTime mit einer Stunde früher, konvertiere sie in UTC und füge die fehlende Stunde danach hinzu. Jetzt hat meine UTC-Datenbank ihre Stundenwerte ohne Löcher oder doppelte Zeitstempel.

    – Packmatte

    13. März 2020 um 10:35 Uhr

1403600cookie-checkZeitzone mit DST-Behandlung durch PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy