72 votes

Comment afficher une date au format iso 8601 avec PHP

J'essaie d'afficher une date de ma base de données MySQL sous la forme d'une chaîne de caractères formatée selon la norme ISO 8601 avec PHP, mais le résultat est incorrect.

Le 17 octobre 2008 apparaît comme : 1969-12-31T18:33:28-06:00, ce qui est manifestement incorrect (l'année devrait être 2008 et non 1969).

Voici le code que j'utilise :

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

$post[3] est la date (CURRENT_TIMESTAMP) de ma base de données MySQL.

Une idée de ce qui ne va pas ?

96voto

Paolo Bergantino Points 199336

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

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

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

1 votes

S'il vous plaît, utilisez les classes ! Jetez un coup d'oeil à la solution de @John Conde, ;)

3 votes

En date() la fonction diminue la précision utilisez plutôt la solution de John !

0 votes

@Christian qu'est-ce que 'La fonction date() diminue la précision' ?

43voto

John Conde Points 102874

Utilisation de la Classe DateTime disponible dans la version 5.2 de PHP, il serait fait comme ceci :

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

Voyez-le en action

Depuis PHP 5.4, vous pouvez faire cela en une seule ligne :

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

20voto

John Slegers Points 509

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

Notes :

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 voulez que l'entrée soit pour un fuseau horaire différent, vous devez définir votre fuseau horaire explicitement. 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 voulez que la sortie soit pour un fuseau horaire différent de celui de votre entrée, vous pouvez définir votre fuseau horaire explicitement :

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

8voto

Newmania Points 169

Pour les versions antérieures à PHP 5 :

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

6 votes

Pourquoi ne pas échapper au signe T ... et la condition !$time n'est pas nécessaire, car l'heure actuelle est utilisée lorsqu'aucun paramètre horaire n'est donné ou lorsqu'il est nul : date('Y-m-d \TH :i:s \Z ', $time);//Z représente le fuseau horaire actuel

8voto

Guillaume Points 149

Voici la bonne fonction pour les versions antérieures à PHP 5 : J'ai ajouté la différence GMT à la fin, elle n'est pas codée 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));
}

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