Quel format de date utiliser pour une API REST et/ou JavaScript ?

Quel format de date utiliser pour une API REST et/ou JavaScript ?

Avec PHP, le format timestamp Epoch est (presque) le format idéal. Mais une fois qu’on fait la passerelle avec JavaScript, est-ce toujours le cas ? La réponse est… non.

Timestamp Epoch

J’ai pas mal utilisé, et j’utilise toujours, PHP.

Avec ce langage, un format simple de manipulation de dates est le timestamp Epoch, en l’occurrence celui d’Unix, c’est-à-dire une représentation des dates sous la forme du nombre de secondes depuis le 1er janvier 1970.

Par exemple :  1412586000 correspond au 06 octobre 2014 à 11h00.

Beaucoup de fonctions PHP renvoient des dates au format timestamp Epoch (filemtime() par exemple), et le langage propose des fonctions pour les traduire en dates lisibles plus facilement (la fonction date()) et pour les manipuler (mktime() et time()), c’est-à-dire ajouter une semaine à une date, ou convertir une date sous la forme d’une chaine de caractères en timestamp.

<?php
// Creation du timestamp Epoch
$d = mktime(11, 0, 0, 10, 6, 2014);
echo "La date au format timestamp Epoch : " . $d . "\n";
echo "Et en français : " . date("d/m/Y H:i:s", $d) . "\n";

// affiche :
// La date au format timestamp Epoch : 1412586000
// Et en français : 06/10/2014 11:00:00
?>

Il s’agit d’un format pivot très pratique mais qui présente quelques inconvénients :

  • la date minimum est le 01/01/1970, mais il est possible d’utiliser des entiers négatifs pour une application historique ou pour les dates de naissance par exemple
  • la date n’est pas très humainement lisible
  • il n’est pas simple de lui adjoindre d’indication de timezone

Utilisation en JavaScript

Ce format est peut-être un standard pour un langage comme PHP, mais qu’en est-il de son utilisation avec JavaScript ?

A priori, ce n’est pas beaucoup plus compliqué avec la classe native Date(). L’astuce réside en la multiplication par 1000 des timestamp Epoch venant de PHP :

var timestampFromPhp = 1412586000;
var d = new Date(timestampFromPhp  * 1000);

Là où ça se complique, c’est lorsqu’on récupère un tableau d’objets contenant des dates dans ce format.

Un exemple concret, un service REST renvoie une liste de membres avec leur date d’inscription, dans des ressources AngularJS :

$scope.members = Member.query();

Pour afficher les dates dans le contrôleur, une solution est de faire la multiplication à l’affichage pour lui appliquer le filtre ngDate d’AngularJS :

Date d'inscription : {{member.signinDate * 1000 | date}}

Une autre solution est de faire la conversion dès la réception des données, dans la callback (ou la promesse) de query(), avec une boucle. Fasitidieux également…

Enfin, dans les deux cas, et c’est certainement le plus gros inconvénient, si l’application propose de modifier la date, il faudra faire l’opération inverse, c’est-à-dire diviser par 1000 avant la mise à jour par l’API REST.

Il est peut-être temps de trouver un nouveau format pivot qui satisfasse à la fois PHP (ou votre langage côté serveur préféré), JavaScript et REST.

Le format RFC2822

Une solution pour faire mieux communiquer PHP, JavaScript et REST est l’utilisation du format de date de la RFC2822.

Notre date est alors présentée sous cette forme : Mon, 06 Oct 2014 11:00:00 +0200

Dès le premier coup d’œil, vous pouvez constater que les limitations du timestamp Epoch n’ont plus lieu d’être : le format est lisible facilement, l’indication de timezone est présente et on n’est plus limité au 01/01/1970.

Aussi, il me semble être un pivot tout aussi efficace que le timestamp Epoch, notamment grâce aux passerelles fournies par PHP, pour passer d’Epoch à RFC2822 si besoin :

<?php
// Creation du timestamp Epoch
$d = mktime(11, 0, 0, 10, 6, 2014);
echo "La date au format timestamp Epoch : " . $d . "\n";
// Conversion en date au format RFC2822
$r = date("r", $d);
echo "En RFC2822 : " . $r . "\n";
// Reconversion en timestamp Epoch
echo "Encore en timestamp Epoch : " . strtotime($r) . "\n";

// affiche :
// La date au format timestamp Epoch : 1412586000
// En RFC2822 : Mon, 06 Oct 2014 11:00:00 +0200
// Encore en timestamp Epoch : 1412586000
?>

Et côté JavaScript/vue AngularJS, la date peut être formatée directement avec le filtre date, sans traitement supplémentaire :

Date d'inscription : {{member.signinDate | date}}

Et cerise sur le gâteau, la valeur peut être mise à jour directement dans ce format par l’API REST.

Le mot de la fin

Pour faire le lien entre PHP et JavaScript, le format RFC2822 est un meilleur choix pour la date.

Ok, elle était facile celle-là.


L'illustration de cet article est une image sous licence CC BY-SA 3.0 par Nilfanion

Cet article vous a été utile ? Partage it !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Si vous le souhaitez, renseignez le champ 'Nom' de cette façon : 'VotreNom@VotreMotClef' pour obtenir une ancre optimisée pour les moteurs de recherche.