114 votes

PHP Horodatage en DateTime

Savez-vous comment je peux convertir ceci en un strtotime, ou un type similaire de valeur à passer dans l'objet DateTime ?

La date que j'ai :

Lun, 12 Dec 2011 21:17:52 +0000

Ce que j'ai essayé :

$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));

$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

Le code ci-dessus n'est pas correct. Si je boucle à travers différentes dates, c'est toujours la même date.

226voto

drrcknlsn Points 7727

Vous n'avez pas besoin de convertir la chaîne en horodatage pour créer l'objet DateTime (en fait, son constructeur ne vous permet même pas de le faire, comme vous pouvez le constater). Vous pouvez simplement transmettre votre chaîne de date au constructeur DateTime telle quelle :

// En supposant que $item->pubDate soit "Mon, 12 décembre 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

Cela dit, si vous avez un horodatage que vous souhaitez utiliser à la place d'une chaîne, vous pouvez le faire en utilisant DateTime::setTimestamp() :

$timestamp = strtotime('Mon, 12 décembre 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

Édition (2014-05-07):

En fait, je n'étais pas au courant de cela à l'époque, mais le constructeur DateTime prend effectivement en charge la création d'instances directement à partir de horodatages. Selon cette documentation, tout ce que vous avez à faire est de préfixer l'horodatage avec un caractère @ :

$timestamp = strtotime('Mon, 12 décembre 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);

66voto

John Slegers Points 509

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

56voto

forsberg Points 151

Sans doute la solution la plus simple est simplement :

DateTime::createFromFormat('U', $timeStamp);

Où 'U' signifie l'époque Unix. Voir la documentation : http://php.net/manual/en/datetime.createfromformat.php

0voto

ingenious Points 626

Voici ma solution :

 `function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s") {
    $date = new DateTime($date, new DateTimeZone($from));
    $date->setTimeZone(new DateTimeZone($to));
    return $date->format($targetFormat);
}`

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