Manipuler des dates (A TERMINER)

Comment manipuler des dates sous formes de chaînes de caractères.
vendredi 11 mai 2007.
 

Généralités

Depuis la nuit des temps, la mesure, la représentation du temps ont posées des problèmes à l’Humanité. Si le sujet vous intéresse, consultez Wikipedia entre autres, et plus particulièrement ce qui est relatif au calendrier Grégorien .

Il est possible d’avoir plusieurs acceptions au mot "date". Généralement, c’est une représentation de la mesure du temps. On peut mesurer un positionnement (Par ex. nous sommes le 1 janvier 1970 zéro heure). Certains l’entendent comme la mesure entre deux positionnement, c’est à dire, un intervalle, une différence, un écart. (Par ex. le premier avril est trois mois après le premier janvier).

Les dates disposent de plusieurs représentations. Ces représentations peuvent suivre des formats numériques, ou bien alors des formats alphanumériques.

Vous pouvez facilement imaginer la pesanteur engendrée par la gestion des ces représentations, tantôt numérique, tantôt alphabétique, dans des langues différentes, suivant des casses variables, etc.

Formats numériques.

Epoch, ou Unix timestamp

Le plus pratique. La date est représentée sous la forme d’un entier, dont la valeur est la somme des secondes depuis le premier janvier 1970, 0 heure, 0 minute, 0 seconde.


$ ./php -r "echo 'ts=' . strtotime('now') . ', date=' . date('d/m/Y H:i:s');"

affiche


ts=1175181882, date=29/03/2007 17:24:42

Plus d’information sur Epoch par Wikipedia , et Quel Epoch vivons-nous !

Formats alphanumériques.

Extrait de la page de la documentation php qui traite des fonctions relatives aux dates et heures. http://fr.php.net/manual/fr/ref.dat...

DATE_ATOM (2005-08-15T15:52:01+0000)

DATE_COOKIE (Mon, 15 Aug 2005 15:52:01 UTC)

DATE_ISO8601 (2005-08-15T15:52:01+0000)

DATE_RFC822 (Mon, 15 Aug 2005 15:52:01 UTC)

DATE_RFC850 (Monday, 15-Aug-05 15:52:01 UTC)

DATE_RFC1036 (Monday, 15-Aug-05 15:52:01 UTC)

DATE_RFC1123 (Mon, 15 Aug 2005 15:52:01 UTC)

DATE_RFC2822 (Mon, 15 Aug 2005 15:52:01 +0000)

DATE_RSS (Mon, 15 Aug 2005 15:52:01 UTC)

DATE_W3C (2005-08-15T15:52:01+0000)

Et ce n’est pas finit ! Des pays ou nation modifie ces formats, notamment en intervertissant les jours, les mois, les années. Les chaînes de caractères sont différentes suivant les langues. Et d’aucun utilise des formats fantaisistes, très librement adaptés, en particulier à partir du format ISO8601, souvent décliné en yyyymmddhhiiss, 20070329172442, ou plus court.

Voir la synthèse de la norme ISO 8601 sur Wikipedia

Le plus simple est d’utiliser tant que faire se peut, surtout pour le stockage, le format Unix Timestamp, malgré ses limitations. Pour cela, il est nécessaire de convertir depuis et vers un format humainement lisible, correctement localisé.

(Le format est-il réellement différent entre Windows et Unix ?)

Conversions

Les conversions rendent implicite la localisation du format des dates. Pour que PHP tienne compte de ceci, il convient de le paramètrer quelque peu, à travers la fonction setlocale() . Dans notre cas, en France,

setlocale(LC_TIME, 'Fr');

Les chaînes de caractères doivent être éclatées en entités logiques ; le jour, le mois, l’heure, etc. Pour atteindre ce but, j’utilise une fonction connexe aux expressions rationelles (preg_split() ) et une fonction qui affecte le contenu des cellules d’un tableau vers des variables prédéterminées (list() ).


// definition d'un variable contenant une date avec 3 separateurs differents
$maDate = '29/03/2007 17:24:42';
list($j, $m, $a, $h, $i, $s) = preg_split('/\D+/', $maDate);
La fonction va séparer les zones, en considérant que les séparateurs sont n’importe quel caractère, sauf un chiffre, sur une longueur >= 1 caractère.

Si la date fournie comprend des caractères, par exemple "29 mars 2007 17:24:42", l’expression rationelle sera ’/\W+/’.

De Epoch vers local

date() strftime()

De local vers Epoch

strtotime()

Stockage dans MySql

MySql reconnait différents formats de stockage de date.

Arithmétique lié aux dates

mktime()

FAQ des calendriers Wikipedia ::Date


Forum