Mktime Funktion Wrong Time Rückkehr?
Frage
Ich habe ein paar Probleme mit der mktime Funktion. Auf meinem Produktions-Server, wenn ich führen Sie das folgende:
echo '<p>' . mktime(24, 0,0, 8,29,2009) . ' - 12pm</p>';
echo '<p>' . mktime(23, 0,0, 8,29,2009) . ' - 11pm</p>';
echo '<p>' . mktime(22, 0,0, 8,29,2009) . ' - 10pm</p>';
Und dann diese Zeitstempel konvertieren zurück zu lesbarem Format (unter Verwendung von www.unixtimestamp.com für die schnelle Konvertierung), die Zeiten sind alle um eine Stunde ab. Ursprünglich dachte ich, das ein Problem mit 2400 VS 0000 war, aber das wäre Konto nicht für die anderen Termine sind aus.
Irgendwelche Ideen?
Lösung
Der Server verfügt über eine andere Zeitzone, als Sie erwarten. Unix-Zeitstempel in Sekunden gemessen seit 00.00.00 1.1.1970 GMT , so haben Sie eine versteckte Zeitzone Umwandlung in Ihrem Code. Sie können entweder
- verwenden
gmmktime()
einen Zeitstempel für ein GMT-Datum zu erstellen, - verwenden, um den eingebauten Klasse Datetime ,
- korrigieren Sie die Zeitzoneneinstellungen in der php.ini oder
- die Zeitzone mit der Funktion verwenden
date_default_timezone_set()
.
Andere Tipps
Ich lief die folgende von der Kommandozeile und bekam die folgende (erwarteten) ausgegeben. Was passiert, wenn man sie laufen?
$ php -r "echo date('H:i:s Y-m-d', mktime(24, 0, 0, 8, 29, 2009));"
00:00:00 2009-08-30
$ php -r "echo date('H:i:s Y-m-d', mktime(23, 0, 0, 8, 29, 2009));"
23:00:00 2009-08-29
$ php -r "echo date('H:i:s Y-m-d', mktime(22, 0, 0, 8, 29, 2009));"
22:00:00 2009-08-29
Mein Problem war, dass in mktime
I-Eingang Tag und Monat mit führenden Nullen . Als die Funktion zurückgegeben mich zu falschen Ergebnissen. Eine Möglichkeit wäre, die führende Null mit einer Funktion wie
$str = ltrim($str, '0');
Quelle: Wie alle führenden Nullen in einer Zeichenkette entfernen
oder
$var = (int)$var;
Quelle: PHP entfernen erste Nullen
Ich habe eine Möglichkeit von soulmerge:
$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();
Aber die Zeitzone sollte immer eingestellt werden (entweder mit date_default_timezone_set()
oder direkt mit DateTime
.