web-dev-qa-db-fra.com

Comment afficher une date au format ISO 8601 avec PHP

J'essaie d'afficher une date/heure à partir de ma base de données MySQL sous la forme d'une chaîne formatée ISO 8601 avec PHP mais cela se passe mal.

17 oct 2008 sort comme: 1969-12-31T18: 33: 28-06: 00 ce qui n'est clairement pas correct (l'année devrait être 2008 et non 1969)

Voici le code que j'utilise:

<?= date("c", $post[3]) ?>

$post[3] is the datetime (CURRENT_TIMESTAMP) de ma base de données MySQL.

Des idées ce qui ne va pas?

55

Le deuxième argument de date est un horodatage UNIX, pas une chaîne d'horodatage de base de données.

Vous devez convertir l'horodatage de votre base de données avec strtotime .

<?= date("c", strtotime($post[3])) ?>
71
Paolo Bergantino

En utilisant la classe DateTime disponible dans PHP version 5.2, cela se ferait comme ceci:

$datetime = new DateTime('17 Oct 2008');
echo $datetime->format('c');

Voyez-le en action

À partir de PHP 5.4, vous pouvez le faire en une ligne:

echo (new DateTime('17 Oct 2008'))->format('c');
30
John Conde

Style procédural:

echo date_format(date_create('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

Style orienté objet:

$formatteddate = new DateTime('17 Oct 2008');
echo $datetime->format('c');
// Output : 2008-10-17T00:00:00+02:00

Hybride 1:

echo date_format(new DateTime('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

Hybride 2:

echo date_create('17 Oct 2008')->format('c');
// Output : 2008-10-17T00:00:00+02:00

Remarques :

1) Vous pouvez également utiliser 'Y-m-d\TH:i:sP' comme alternative à 'c' pour votre format.

2) Le fuseau horaire par défaut de votre entrée est le fuseau horaire de votre serveur. Si vous souhaitez que l'entrée soit pour un fuseau horaire différent, vous devez définir explicitement votre fuseau horaire. Cela aura également un impact sur votre sortie, cependant:

echo date_format(date_create('17 Oct 2008 +0800'), 'c');
// Output : 2008-10-17T00:00:00+08:00

3) Si vous souhaitez que la sortie soit pour un fuseau horaire différent de celui de votre entrée, vous pouvez définir explicitement votre fuseau horaire:

echo date_format(date_create('17 Oct 2008')->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2008-10-16T18:00:00-04:00
13
John Slegers

Pour pre PHP 5:

function iso8601($time=false) {
    if(!$time) $time=time();
    return date("Y-m-d", $time) . 'T' . date("H:i:s", $time) .'+00:00';
}
8
Newmania

Voici la bonne fonction pour pre PHP 5: J'ai ajouté la différence GMT à la fin, ce n'est pas codé en dur.

function iso8601($time=false) {
    if ($time === false) $time = time();
    $date = date('Y-m-d\TH:i:sO', $time);
    return (substr($date, 0, strlen($date)-2).':'.substr($date, -2));
}
7
Guillaume