Função mktime Retornando hora errada?
Pergunta
Eu estou tendo um pouco de dificuldade com a função mktime. No meu servidor de produção, se eu executar a seguinte:
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, em seguida, converter esses timestamps volta para o formato legível (usando www.unixtimestamp.com para conversão rápida), os tempos estão todos fora por uma hora. Inicialmente eu pensei que este era um problema com 2400 VS 0000, mas que não conta para as outras datas estar fora.
Todas as idéias?
Solução
O seu servidor tem um fuso horário diferente do que você está esperando. timestamps Unix são medidos em segundos desde 1.1.1970 00:00:00 GMT , então você tem uma conversão de fuso horário escondido em seu código. Você pode
- usar
gmmktime()
para criar um timestamp uma data GMT para, - usar o builtin DateTime classe ,
- fuso horário configurações no php.ini ou
- definir o fuso horário para usar com a função
date_default_timezone_set()
.
Outras dicas
Eu corri o seguinte na linha de comando e tem o seguinte resultado (esperado). O que acontece se você executá-los?
$ 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
Meu problema era que na entrada mktime
I o dia eo mês com zeros à esquerda . Que a função retornou me resultados errados. Uma opção seria remover o zero com uma função como
$str = ltrim($str, '0');
Fonte: Como remover todos os zeros à esquerda em uma string
ou
$var = (int)$var;
Fonte: PHP remover primeiro zeros
Eu usei uma possibilidade de soulmerge:
$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();
Mas o fuso horário deve ser sempre definido (ou com date_default_timezone_set()
ou diretamente com DateTime
.