2009-07-13 7 views
1

J'ai un peu de mal avec la fonction mktime. Sur mon serveur de production, si j'exécutez la commande suivante:Fonction MKTime retournant un mauvais temps?

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>'; 

Et puis convertir ces horodatages revenir à un format lisible (à l'aide www.unixtimestamp.com pour la conversion rapide), les temps sont décalés d'une heure. J'ai d'abord pensé que c'était un problème avec 2400 VS 0000, mais cela ne tient pas compte des autres dates étant hors tension.

Des idées?

Répondre

5

Votre fuseau horaire a un fuseau horaire différent de celui auquel vous vous attendez. Les horodatages Unix sont mesurés en secondes depuis le 1.1.1970 00:00:00 GMT, vous avez donc une conversion de fuseau horaire cachée dans votre code. Vous pouvez

+0

J'ai défini mon fuseau horaire par défaut, qui n'a pas été défini. Une enquête plus poussée a l'air d'avoir sauté le pistolet, l'horodatage convertit en avant et en arrière tout à fait bien, et il fait bien dans la DB. Cela semble être un problème d'affichage seulement. Merci pour l'aide en tout cas. –

0

Je viens de lancer ce qui suit à partir de la ligne de commande et j'ai obtenu la sortie suivante (attendue). Que se passe-t-il si vous les exécutez?

$ 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 
0

Mon problème était que mktime entrée I le jour et le mois avec des zéros à gauche . Que la fonction m'a retourné mauvais résultats. Une option serait de supprimer le zéro avec une fonction comme

$str = ltrim($str, '0'); 

Source: How to remove all leading zeroes in a string

ou

$var = (int)$var; 

Source: PHP remove first zeros

je une possibilité de soulmerge:

$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds); 
$match_time = $date->getTimestamp(); 

Mais le fuseau horaire doit toujours être défini (soit avec date_default_timezone_set() ou directement avec DateTime.

+0

Bien que n'étant pas le coupable dans l'OP, vaut la peine de le noter comme une chute éventuelle de la fosse. – johnsnails

Questions connexes