28 votes

Pourquoi les horodatages PHP et MySQL Unix divergent-ils le 1983-10-29?

J'ai été en utilisant PHP strtotime et MySQL UNIX_TIMESTAMP fonctions dans mon application, de convertir des dates dans les horodateurs. PHP et MySQL sont en cours d'exécution sur ma machine locale, et ces fonctions retournent généralement le même résultat, comme je l'avais prévu:

$ php
<?php echo strtotime("2011-06-02"); ?>
1307001600

mysql> SELECT UNIX_TIMESTAMP("2011-06-02") ts;
+------------+
| ts         |
+------------+
| 1307001600 |
+------------+

Mais, sorta par hasard, j'ai remarqué que lorsque je suis entré 1983-01-01 comme la date, les résultats étaient plus égaux:

$ php
<?php echo strtotime("1983-01-01"); ?>
410263200

mysql> SELECT UNIX_TIMESTAMP("1983-01-01") ts;
+-----------+
| ts        |
+-----------+
| 410256000 |
+-----------+

Comme vous pouvez le voir, PHP retourné 410263200, alors que MySQL a retourné 410256000 - une différence de 7200 secondes.

Cela m'a fait curieux, et je voulais savoir à quelle date les horodateurs n'ont plus d'équivalent, j'ai donc écrit un petit programme qui démarre aujourd'hui avec la date (Y-m-d le format), utilise PHP strtotime et MySQL UNIX_TIMESTAMP et compare les résultats. Il soustrait ensuite le 1er jour de chaque valeur et les boucles jusqu'à ce qu'ils ne sont plus égaux.

Le résultat:

1983-10-29

Sur octobre 29, 1983, pour une raison quelconque, strtotime et UNIX_TIMESTAMP retour des valeurs qui diffèrent par 7200 secondes.

Des idées?

Merci pour la lecture.

22voto

Matt Gibson Points 15086

Vous dites que vous êtes sur l'Alaska temps. À partir de http://www.statoids.com/tus.html:

1983-10-30 02:00: Toutes les parties de l'Alaska à l'exception des îles Aléoutiennes et Saint-Laurent de l'Île passé à À la. Avant le changement, de l'Alaska à l'est de 138°W (Juneau) avait été sur PT; entre 138°W et 141°W (Yakutat) avait été sur le Yukon Temps, qui a été UTC-9 avec l'heure d'été; à l'ouest de 162°W (Nome) avait été sur les mers de Béring Temps, qui a été UTC-11 avec l'heure d'été. Nom de l'Alaska, Hawaï, horaire modifié à Hawaii-Aléoute.

Donc, je suppose que c'est parce que votre fuseau horaire modifié par deux heures (7200 secondes = 2 heures) le 30 octobre 1983.

Je suppose que MySQL UNIX_TIMESTAMP est à l'aide d'un autre fuseau horaire de votre Alaska en PHP, qui peut être soit le serveur par défaut, ou dépend de vos paramètres de connexion, de sorte que ces divergent quand vous frappez cette date.

Vous pourriez être en mesure de glaner plus d'informations en demandant à MySQL que son fuseau horaire est sur que la connexion avec SELECT @@global.time_zone, @@session.time_zone;; voir cette réponse pour plus d'infos sur la sortie et la manière de les interpréter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X