Funzione mktime Tornando Wrong Time?
Domanda
Sto avendo un po 'di problemi con la funzione mktime. Sul mio server di produzione, se eseguo il seguente:
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>';
E poi convertire i timestamp di nuovo al formato leggibile (utilizzando www.unixtimestamp.com per la conversione rapida), i tempi sono tutti fuori di un'ora. Ho inizialmente pensato che questo fosse un problema con 2400 VS 0000, ma questo non spiegherebbe le altre date essere fuori.
Tutte le idee?
Soluzione
Il server ha un fuso orario diverso che si aspettano. timestamp Unix sono misurati in secondi dal 1.1.1970 00:00:00 GMT , in modo da avere una conversione fuso orario nascosta nel codice. È possibile
-
gmmktime()
per creare un timestamp per una data GMT, - classe DateTime ,
- impostazioni di fuso orario in php.ini o
- impostare il fuso orario da utilizzare con la funzione
date_default_timezone_set()
.
Altri suggerimenti
Ho appena eseguito il seguente dalla riga di comando ed ho ottenuto il seguente output (expected). Che cosa succede se vengono eseguiti?
$ 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
Il mio problema era che in ingresso mktime
I il giorno e il mese con il zeri iniziali . Rispetto alla funzione mi ha restituito risultati errati. Una possibilità sarebbe quella di togliere lo zero con una funzione come
$str = ltrim($str, '0');
Fonte: Come rimuovere tutti zeri iniziali in una stringa
o
$var = (int)$var;
Fonte: rimuovere primi zeri
Ho usato una possibilità da soulmerge:
$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();
Ma il fuso orario deve essere sempre impostato (sia con date_default_timezone_set()
o direttamente con DateTime
.