Alors que @drrcknlsn a raison d'affirmer qu'il existe plusieurs façons de convertir une chaîne de temps en un datetime, il est important de réaliser que ces différentes façons ne traitent pas les fuseaux horaires de la même manière.
Option 1 : DateTime('@' . $timestamp)
Considérez le code suivant :
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
La partie strtotime
élimine les informations sur le fuseau horaire, et la fonction date_create
suppose GMT.
Ainsi, la sortie sera la suivante, peu importe sur quel serveur je l'exécute :
2011-12-12T13:17:52+00:00
Option 2 : date_create()->setTimestamp($timestamp)
Considérez le code suivant :
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Vous pourriez vous attendre à ce que cela produise la même sortie. Cependant, si j'exécute ce code à partir d'un serveur belge, j'obtiens la sortie suivante :
2011-12-12T14:17:52+01:00
Contrairement à la fonction date_create
, la méthode setTimestamp
suppose le fuseau horaire du serveur (CET dans mon cas) plutôt que GMT.
Définition explicite de votre fuseau horaire
Si vous voulez vous assurer que votre sortie correspond au fuseau horaire de votre entrée, il est préférable de le définir explicitement.
Considérez le code suivant :
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Maintenant, considérez également le code suivant :
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Parce que nous avons explicitement défini le fuseau horaire de la sortie pour correspondre à celui de l'entrée, les deux produiront la même sortie correcte :
2011-12-12T21:17:52+08:00