2016-03-18 14 views
2

Ich arbeite an einigen zeitbezogenen Funktionen und ich entscheide mich dafür, UTC-Zeiten immer zu verwenden und Zeitstempel als Ganzzahlen für Konsistenz zu speichern.PHP mktime und timezone

Allerdings habe ich festgestellt, dass, wenn ich mktime verwende, es scheint, dass die aktuell eingestellte Zeitzone einen Einfluss auf den Rückgabewert von mktime hat. Aus der Dokumentation verstehe ich, dass mktime soll die Anzahl der Sekunden seit Epoche zurückzukehren:

Gibt den Unix-Zeitstempel an die gegebenen Argumente entsprechen. Dieser Zeitstempel ist eine lange ganze Zahl, die die Anzahl der Sekunden zwischen der Unix-Epoche (1. Januar 1970 00:00:00 GMT) und der angegebenen Zeit enthält.

http://php.net/manual/en/function.mktime.php

Allerdings scheint es, dass mktime die Zeitzone enthält, die zur Zeit eingestellt ist. Wenn mit dem folgenden Code:

date_default_timezone_set('UTC'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

date_default_timezone_set('Australia/Sydney'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

würde ich erwarten, dass die zwei Mal gleich sein vales aber anscheinend sind sie nicht:

1451606400 - 1451566800 = 39600/(60*60) = 11 
:

1451606400 
1451566800 

Welche exacly eine 11 Stunden Unterschied zu sein scheint

Was verstehe ich nicht richtig über mktime und/oder warum wird die Zeitzone bei der Verwendung von mktime berücksichtigt?

Antwort

5

Ich kann Ihnen nicht sagen, warum es die Art und Weise ist es (PHP hat nie Sinn für mich gemacht, wenn es um Datum und Zeit kommt), aber es ist eine alternative Funktion gmmktime(), die

identisch ist mktime() außer den übergebenen Parametern steht für ein GMT-Datum. gmmktime() verwendet intern mktime(), so dass nur Zeiten verwendet werden können, die in der abgeleiteten lokalen Zeit gültig sind.

Es gibt auch eine comment on the PHP documentation for this function, die erklärt, wie mktime(), gmmktime() und time() Arbeit. Im Wesentlichen gehen sie davon aus, dass Sie immer in Zeitzonen denken, selbst wenn ein UNIX-Zeitstempel selbst keine Zeitzone enthält.

+1

Autsch. Das ist ziemlich schlimm. Sie mussten nur UTC für alle Zeitfunktionen verwenden und beim "Anzeigen" nur eine Zeitzone einbauen. Ich schätze, dass es so ist, weil PHP "Geschichte" ist ... Danke für deine Antwort! – Luke