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?
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');
À partir de PHP 5.4, vous pouvez le faire en une ligne:
echo (new DateTime('17 Oct 2008'))->format('c');
echo date_format(date_create('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00
$formatteddate = new DateTime('17 Oct 2008');
echo $datetime->format('c');
// Output : 2008-10-17T00:00:00+02:00
echo date_format(new DateTime('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00
echo date_create('17 Oct 2008')->format('c');
// Output : 2008-10-17T00:00:00+02:00
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
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';
}
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));
}