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?

Foi útil?

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

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top