Certains flux RSS s'appuient sur la norme ISO 8601 pour afficher la date de leurs publications au format RSS.
Ainsi vous avez peut-être déjà croisé ce format de date :
2009-04-13T20:48:11+00:00
Qui correspond à la date du : 13 Avril 2009, 20 heures 48 minutes et 11 secondes
L'ISO 8601 établit une représentation numérique de la date et de l'heure convenue au plan international. Les éléments sont représentés selon un ordre décroissant, du plus grand au plus petit: année-mois-jour.
Plusieurs modalités de fonctionnement sont possibles, mais celle-ci reste la plus claire et utilisée sur le web : YYYY-MM-DDThh:mm:ss, où la majuscule T est employée pour séparer les éléments de la date et de l'heure.
Pour manipuler les dates en PHP, il est possible d'utiliser le timestamp. Voici donc une fonction que j'ai crée à l'occasion pour convertir une date au format ISO 8601 vers un timestamp :
function isoTimeToStamp($iso) { sscanf($iso,"%4u-%u-%uT%u:%2u:%2uZ",$annee,$mois,$jour,$heure,$minute,$seconde); $newTstamp = mktime($heure,$minute,$seconde,$mois,$jour,$annee); return $newTstamp+3600; }
Note : dans mon exemple, j'ajoute 3600 secondes (soit 1h) pour prendre en compte l'heure d'été.
Voici deux autres fonctions PHP que j'utilise conjointement dans le cadre d'une récupération d'informations d'un flux RSS :
function tStampToFrancais($timestamp_chaine) { return date("d/m/y H:i:s", $timestamp_chaine); } function datefr($chaine) { return tStampToFrancais(isoTimeToStamp($chaine)); }
Exemple d'utilisation :
echo datefr("2009-04-13T20:48:11+00:00");
Retourne :
13/04/09 20:48:11
En inscrivant littéralement un Z final lorsqu’il s’agit de l’heure UTC. (Z pour méridien Zéro). J'ai volontairement précisé la longueur des entiers derrière le "%" pour limiter les dégats par rapport à certains "flux rss maisons" qui ne respectent la norme qu'a moitié ; vous pouvez les remplacer par "%u"' 😉
Les représentations indiquées dans l'ISO 8601 offrent les avantages suivants, comparativement aux représentations utilisées localement :
- facilité de lecture et d'écriture pour les systèmes
- facilité de comparaison et de tri
- indépendance par rapport à la langue
- classement des unités par ordre décroissant, du plus grand au plus petit
- notation courte et de longueur constante pour la plupart des représentations.
Les fonctions ici présentées ne sont absolument pas optimisées et vous risquez de devoir les adapter au format source de la date à traiter. En cas de questions, les commentaires sont ouverts !
Pour la rédaction de ce billet, je me suis appuyé la nomre ISO ainsi que sur ce billet.
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
4 commentaires
je trouve cette implémentation un poil compliqué 🙂 php dispose d'ores et déjà de classe capable de gérer ces dates et donc ces conversions,
$time = new DateTime('2009-04-13T20:48:11+01:00'); // GMT+1 pour tester
echo $time->format('d/m/Y H:i:s'); // 13/04/2009 20:48:11
echo $time->format('Z'); // 3600 (correspond au décalage)
echo $time->format('U'); // 1239652091
la fonction reste utile pour les php < 5 (ça existe encore?)
J'avais pourtant cherché sur le web, mais sans succès (peut-être à cause de mon allergie à la POO ?) !
Merci pour cette information Michael, elle me sera utile 😉
Merci,
Moi ça m'a bien servis, je l'ai modifié pour afficher la date à ma façon mais la base était là ^^
Par contre, Michael, j'ai pas réussi avec ton Object.
merci, ça m'a aidé pour un hébergement chez free en php5.1