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?

È stato utile?

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

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top