Mktime Fonction De retour Wrong Time?
Question
Je vais avoir un peu de mal avec la fonction mktime. Sur mon serveur de production, si j'exécutez la commande suivante:
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 (en utilisant www.unixtimestamp.com pour la conversion rapide), les temps sont décalés d'une heure. Je pensais à l'origine ce fut un problème avec 2400 VS 0000, mais ce ne serait pas en compte les autres dates étant hors tension.
Toutes les idées?
La solution
Votre serveur a un fuseau horaire différent de celui que vous attendez. timestamps Unix sont mesurés en secondes depuis le 1/1/1970 00:00:00 GMT , vous avez une conversion de fuseau horaire caché dans votre code. Vous pouvez soit
-
gmmktime()
pour créer un horodatage pour une date GMT, - utilisez le classe DateTime ,
- paramètres de fuseau horaire dans php.ini ou
- définir le fuseau horaire à utiliser avec la fonction
date_default_timezone_set()
.
Autres conseils
Je viens de rencontrer ce qui suit de la ligne de commande et obtenu les éléments suivants (prévu) sortie. Qu'est-ce qui se passe 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
Mon problème était que je mktime
entrer le jour et le mois avec des zéros à gauche . Que la fonction m'a rendu mauvais résultats. Une option serait de supprimer le zéro avec une fonction comme
$str = ltrim($str, '0');
Source: Comment supprimer tous les zéros à gauche dans une chaîne
ou
$var = (int)$var;
Source: PHP supprimer premiers zéros
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 réglé (soit avec date_default_timezone_set()
ou directement avec DateTime
.