web-dev-qa-db-fra.com

PHP Horodatage dans DateTime

Savez-vous comment je peux convertir cela en strtotime ou un type similaire de valeur à transmettre à l'objet DateTime?

La date que j'ai:

Mon, 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');

Ce qui précède n'est pas correct. Si je passe en boucle plusieurs dates différentes, c’est la même date.

61
JREAM

Vous n'avez pas besoin de transformer 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 introduire votre chaîne de date dans le constructeur DateTime tel quel:

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

Cela dit, si vous souhaitez utiliser un horodatage au lieu d’une chaîne, vous pouvez le faire en utilisant DateTime::setTimestamp() :

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

Edit (2014-05-07):

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

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
111
FtDRbwLXw6

Tandis que @drrcknlsn est correct pour affirmer qu'il existe plusieurs façons de convertir une chaîne temporelle en heure datatisée, il est important de réaliser que ces différentes manières ne traitent pas les fuseaux horaires de la même manière.


Option 1: DateTime('@' . $timestamp)

Considérons le code suivant:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

Le bit strtotime élimine les informations de fuseau horaire et la fonction date_create suppose que GMT (Europe/Brussels).

En tant que tel, le résultat sera le suivant, quel que soit le serveur sur lequel je l'exécute:

2011-12-12T13:17:52+00:00

Option 2: date_create()->setTimestamp($timestamp)

Considérons le code suivant:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

Vous pouvez vous attendre à ce que cela produise le même résultat. Cependant, si j'exécute ce code depuis un serveur belge, j'obtiens le résultat suivant:

2011-12-12T14:17:52+01:00

Contrairement à la fonction date_create, la méthode setTimestamp suppose le fuseau horaire du serveur ('Europe/Brussels' dans mon cas) plutôt que GMT.


Définir explicitement 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 la définir explicitement.

Considérons 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érons é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')

Comme nous avons explicitement défini le fuseau horaire de la sortie sur celui de l'entrée, les deux créeront la même sortie (correcte):

2011-12-12T21:17:52+08:00
22
John Slegers

La solution la plus simple est probablement simplement:

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

Où 'U' signifie Unix Epoch. Voir docs: http://php.net/manual/en/datetime.createfromformat.php

12
forsberg

c'est 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);
    }
0
ingenious