gmdate pas constant sur les serveurs?

J’ai travaillé sur une application qui doit faire beaucoup de calculs avec le temps.

Pour que tout fonctionne, j’ai commencé par:

$dateToday = strtotime(gmdate("m/d/y")); 

Si j’ai bien compris, ceci est censé renvoyer la date GMT. Donc, quel que soit le fuseau horaire du serveur, je devrais obtenir le même temps?

Ainsi, au fur et à mesure de mon développement sur localhost, tout fonctionnait bien, mais lorsque j’ai déménagé sur un serveur dans un fuseau horaire différent, j’ai commencé à avoir des problèmes.

Faire écho à “$ dateToday” sur localhost me donne “1501192800”, tout en faisant la même chose sur le serveur je reçois “1501214400”. C’est la même chose que le décalage horaire de 6h entre ma machine locale et le serveur.

Alors qu’est-ce que je manque ici?

Merci

 $dateToday = strtotime(gmdate("m/d/y")); 

Si j’ai bien compris, ceci est censé renvoyer la date GMT.

Pas du tout.

gmdate() formate une date en utilisant le fuseau horaire GMT. Comme vous l’avez appelé avec un seul argument, la date est formatée en appelant time() .

time() renvoie l’horodatage actuel, c’est-à-dire le nombre de secondes écastings depuis le Jan 1, 1970, 0:00:00 UTC .

Ensuite, gmdate() utilise le format que vous fournissez dans son premier argument pour produire une représentation textuelle de son second argument (l’horodatage actuel tel que nous l’avons vu). La valeur renvoyée par gmdate("m/d/Y") est le 07/28/2017 .

Ensuite, le 07/28/2017 est passé à strtotime() qui tente de l’interpréter comme une date et en calcule un horodatage. Comme il ne contient aucun composant temporel, strtotime() suppose que l’heure est 0:00:00 .

Et voici la prise. Étant donné que la chaîne fournie comme argument de strtotime() ne contient pas non plus d’informations de fuseau horaire, PHP utilise sa configuration pour adopter un fuseau horaire. Comme vous l’avez déjà découvert, l’exécution du code sur deux serveurs peut produire des résultats différents en raison de configurations différentes.

Pour moi, strtotime(gmdate('m/d/Y')) renvoie 1501200000 et il s’agit de l’horodatage (le moment) lorsque aujourd’hui ( July 18, 2017 ) a démarré sur le UTC horaire UTC (parce que le PHP que j’ai utilisé pour tester utilise “UTC” comme fuseau horaire par défaut . Les valeurs que vous obtenez sur différents serveurs sont les moments temporels aujourd’hui démarrés sur leurs fuseaux horaires respectifs.

Si je lance le même code avec un PHP correctement configuré pour mon fuseau horaire ( Europe/Bucharest ), je reçois 1501189200 . Il est 10800 secondes avant la valeur que j’utilise avec l’ UTC car Europe/Bucharest est actuellement sur UTC+3 (le +2 régulier de l’heure normale de l’Europe de l’Est plus 1 heure en raison de l’heure d’été).

PHP fournit actuellement un ensemble de classes pour gérer la date et l’heure: DateTime et les autres classes dont le nom commence par Date (retrouvez-les dans la documentation). Ils sont plus faciles à utiliser que les anciennes fonctions de date et d’heure et ils savent aussi comment gérer les fuseaux horaires (les anciennes fonctions ne sont pas connues).

Créer un object DateTime qui stocke le début d’aujourd’hui dans le fuseau horaire UTC est aussi simple que:

 $dateToday = new DateTime("today 0:00:00", new DateTimeZone("UTC")); 

Vous pouvez également créer un object DateTime pour “now” (dans le fuseau horaire souhaité), puis définir son heure à 0:00:00 :

 $dateToday = new DateTime("now", new DateTimeZone("UTC")); $dateToday->setTime(0, 0, 0); 

Pour les objects DateTime qui ne sont pas modifiés dans le code (ils sont uniquement en lecture), il est préférable de créer des objects DateTimeImmutable . Cette classe empêche toute modification accidentelle des valeurs stockées.