Accueil > Partage de connaissances > Guides techniques > Gérer les formats de dates pour HTML et SQL
 Version imprimable

Guides techniques
Programmation PHP
Gérer les formats de dates pour HTML et SQL

Les SGBD leaders du marché professionnel sont, pour la plupart, d’origine américaine. Ne cherchez pas plus loin pour comprendre pourquoi les champs de type "date" suivent, pour certains d’entre-eux, un format par défaut du type "Mois/Jour/Année" ou "M d, Y". D’autres, comme MySQL, suivent le format ISO "Année/Mois/Jour". Quant à nous autres francophones, nous préférons lire une date au format "Jour/Mois/Année".
Alors, comment faire pour ne pas se prendre les pieds dans le tapis en jonglant avec tous ces formats ?

dimanche 11 juillet 2004, par Richard BONMARIN

Les SGBD recoivent les dates dans un format normalisé mais parfois spécifique : si MySQL est conforme au format ISO "yyyy/mm/dd", MS-SQL utilie le format "M d, Y" par défaut. Quant à SYBASE, il attendra par défaut une date au format de la langue du système d’exploitation ; on peut alors craindre des problèmes si la machine de développement a un OS de langue différente de celle du serveur hébergeant l’application en production...

Le traitement d’une date peut donc s’avérer être un exercice complexe : entre le contrôle syntaxique des données saisies via le champ de formulaire HTML et l’enregistrement en base de données, les embûches sont nombreuses !

C’est pour limiter les risques de confusion dès la saisie qu’il est utile de s’appuyer sur des composants stables issus de boîtes à outils JavaScript ou PHP.

Un calendrier - comme celui proposé dans la rubrique "Boîte à Outils" du site - facilitera la saisie d’une date et une fonction PHP permettra de structurer la date dans le format attendu par le SGBD.

Le format des dates présentées au SGBD

Chaque fois que cela est possible, préférez le format ISO "yyyy/mm/dd" à tout autre, quel qu’il soit : vous serez ainsi assuré(e) d’éviter toute confusion.

Le format ISO est nativement supporté par MySQL et par MS-SQL après modification de la configuration de PHP. Cette modification peut être faite dynamiquement dans un script PHP via la fonction suivante :

Activer le format ISO pour MS-SQL
ini_set('mssql.datetimeconvert',0);

Le cas échéant, il vous faudra adapter le format des dates à celui attendu par le SGBD. PHP propose trois fonctions complémentaires pour manipuler les dates :

- strtotime() convertit une date textuelle anglaise dans un format interne conforme à Unix,
- date() crée une chaîne de caractères portant une date dont la structure est définie en paramètre,
- mktime() permet de construire une date conforme à Unix à partir d’un ensemble de paramètre.

Nota Bene : pour plus de précisions, reportez-vous à l’aide PHP disponible en ligne.

Construire une date au format ISO
$SQL_date = ($HV_date ? date("Y-m-d", strtotime($HV_date)) : "");
$SQL_date = date("Y-m-d");    // Date du jour
Construire une date suivant un format variable
        switch ($GLOBALS['GBL_sgbd_type']) {
                case "mysql":
                        $GLOBALS["GBL_SQLdate"] = "Y-m-d";
                        $GLOBALS["GBL_logdate"] = "Y-m-d H:i:s";
                        $GLOBALS["GBL_emptydate"] = "0000-00-00 00:00:00";
                        break;
                case "mssql":
                        //$GLOBALS["GBL_SQLdate"] = "M d, Y";        // Native format
                        $GLOBALS["GBL_SQLdate"] = "Y-m-d";                // ISO format
                        $GLOBALS["GBL_logdate"] = "Y-m-d H:i:s";
                        $GLOBALS["GBL_emptydate"] = "1900-01-01 00:00:00";
                        break;
                default:
                        $GLOBALS["GBL_SQLdate"] = "Y-m-d";
                        $GLOBALS["GBL_logdate"] = "Y-m-d H:i:s";                // ISO format
                        $GLOBALS["GBL_emptydate"] = "0000-00-00 00:00:00";
        }         // End of switch ($GLOBALS['GBL_sgbd_type'])...
$SQL_date = ($HV_date ? date($GLOBALS["GBL_SQLdate"], strtotime($HV_date)) : $GLOBALS["GBL_emptydate"]);

Traiter une date issue d’un formulaire HTML

Après avoir effectué le contrôle de validité d’une date à l’aide d’une instruction analogue à l’exemple ci-dessous, on supposera que vous disposez d’une variable PHP locale "$LCL_date", par exemple, portant sa valeur. Un bon moyen d’éviter toute équivoque est de présenter le nom du mois en abrégé plutôt que son numéro : cela étant, il vous revient de choisir le format adapté à votre besoin.

Exemple : Contrôle de validité d’une date
if ( ($LCL_date = strtotime($HV_date)) == -1 ) {
   exit ("Date '$HV_date' invalide");
}

Attention :
- La fonction strtotime() accepte n’importe quelle valeur d’un élément de date s’il est numérique : ainsi, "33/44/99" sera recalculée pour donner le 44ème jour du 33ème mois suivant le 1er janvier 1999, soit le 14 octobre 2001 ! En revanche, une expression comme "01 xx 2004" ou "01/xx/2004" sera considérée comme invalide car ’xx’ ne correspond à aucun mois.
- Cette même fonction strtotime() n’accepte que des dates comprises entre le 13 Dec 1901 et le 19 Jan 2038, voire moins : sur une plateforme Windows, strtotime() refusera toute date antérieure au 1er Janvier 1970 !

Exemple : Affichage d’une date
$HTML_date = date("d M Y",$LCL_date);

Traiter les dates issues du SGBD

Préparer les données SQL pour un affichage HTML simple

Une date enregistrée en base de données étant réputée fiable, il vous suffit de choisir le format adapté à votre application. Comme proposé précédemment, il peut être utile de présenter le mois par son nom ou sous forme ISO.

Exemples de formatage d’une date
$HTML_date = date("d M Y",$SQL_date);
$HTML_dateISO = date("Y-m-d",$SQL_date);

Préparer les données SQL pour un formulaire HTML

Choisissez un format de date cohérent à la fois avec votre application et avec vos fonctions d’aide intégrées à la page HTML : si vous associez un calendrier au champ de formulaire, veillez à ce que la date soit parfaitement traitée par le code JavaScript du calendrier. Là encore, préférez une forme explicite avec le nom du mois en abrégé si la fonction du calendrier le supporte.

Remarque : certains sites préfèrent ne courir aucun risque en s’appuyant sur un triplet de champs : le premier porte le jour, le second porte le mois et le troisième l’année. Si cette approche vous séduit, gardez en mémoire la fonction PHP ’date()’ qui vous aidera à décomposer la date originale. Cependant, il restera toujours à vérifier la cohérence de l’ensemble après envoi du formulaire.

Post-scriptum :

Au delà de la gestion des formats, la gestion des dates proprement dite reste un vaste problème, surtout s’il faut gérer un calendrier débordant des limites habituelles d’Unix (du 13 Dec 1901 au 19 Jan 2038, voire du 1er Jan 1970 au 19 Jan 2038 pour les plate-formes les plus limitées).

Cet article se limite modestement à traiter de la gestion des FORMATS de date...


(Aucune contribution au forum)


 

© R. BONMARIN, 2003-2011