2009-04-13 4 views
4

PHP scheint eine ziemlich nervige Methode zu verwenden, um die Zeitzone der Umgebung einzustellen, indem man Regionsnamen anstelle des GMT-Offsets verwendet. Das macht ein Drop-down der Zeitzone zu einem großen Problem, weil es entweder riesig sein muss, um alle möglichen PHP-Zeitzonenwerte aufzunehmen, oder ich muss einen Weg finden, einen GMT-Offset in einen gültigen Wert zu konvertieren, um ihn an PHP zu übergeben.Zeitzone in PHP

Also, bei einem GMT-Offset, wie könnte ich die Zeitzone in PHP einstellen? Zum Beispiel, wie könnte ich den GMT-Offset-Wert von "-8.0" in einen Wert umwandeln, den ich an date_timezone_set() weitergeben könnte?

Antwort

17

Mit einem Regionsnamen ist die rechts Weg, um eine Zeitzone zu beschreiben. Die alleinige Verwendung eines GMT-Offsets ist äußerst zweideutig.

Dies spiegelt sich in Ihrer Frage wider - wie sollten Sie einen GMT-Offset von -8 in eine Zeitzone umwandeln? Nun, das hängt davon ab, was "GMT -8" wirklich bedeutet. Bedeutet es "UTC -8 zu jedem Zeitpunkt" oder bedeutet es "UTC -8 während der Winterzeit und UTC -7 in der Sommerzeit"? Wenn es Letzteres ist, wann beginnt und endet der Winter?

Ich würde hoffe, dass PHP eine wohlbekannte Reihe von Werten für die "feste" (keine DST) Zeitzonen, z. "Etc/GMT + 3" etc. Aber wenn Sie nicht wirklich eine feste Zeitzone meinen, dann ist es besser, herauszufinden, in welcher Region Sie gerade sprechen, weil Ihre Berechnungen sonst fast garantiert falsch sind .

Ich habe die meiste Zeit des letzten Jahres mit Zeitzonen gekämpft. Sie sind ein Schmerz - insbesondere, wenn einige Zonen ihre Regeln für DST ändern (wie die USA vor ein paar Jahren gemacht hat) oder wenn einige Zonen in und aus DST scheinbar nach Belieben aktivieren. All dies in einer einzigen Zahl widerzuspiegeln, ist Torheit. Wenn Sie nur an einem einzelnen Augenblick interessiert sind, könnte es in Ordnung sein - aber an diesem Punkt können Sie auch nur den UTC-Wert speichern. Ansonsten ist ein Name der beste Ansatz. (Es ist nicht unbedingt einfach Segeln an dieser Stelle, wohlgemerkt. Auch die Namen ändern sich im Laufe der Zeit ...)

+0

Wie weiß PHP die Umwandlungen (wie mit DateTimeZone :: getOffset) von einer Region zur anderen wenn sich regionale Zeitmesskonventionen immer ändern? – Calvin

+0

Ich stelle mir vor, dass diese in PHP-Updates kommen. Du hältst deinen PHP gepatcht, oder? :-) – ceejayoz

+1

Gibt es noch Patches für PHP3? = P – Calvin

1

Sie müssen eine Datenbank mit den Sommerzeitdaten von verschiedenen Standorten pflegen, deshalb ist es besser zu speichern ein Ort.

5

Wenn Sie PHP> = 5.2 verwenden, können Sie die integrierte DateTimeZone-Klassenmethode listAbkurariations verwenden.

var_dump(DateTimeZone::listAbbreviations());