dimanche 22 février 2009
Ce n'est pas la première fois que je vois des programmeurs utiliser un array pour définir le nom des mois ou des jours dans une langue d'affichage donnée. Le principe est presque trop simple : on place à l'indice 1 du tableau le nom du premier mois de l'année (Janvier) et ainsi de suite.
$months[1] = 'Janvier';On peut alors extraire la portion qui représente le numéro du mois dans une date (2009-04-01) et se référer à l'indice du tableau pour obtenir le nom du mois.
// ...
$months[12] = 'Décembre';
Mais savez-vous qu'on peut configurer la localisation de PHP pour faire afficher une date en format texte dans la langue désirée ? Alors au lieu d'écrire du code pour rien, tirons-en profit.
D'abord, il faut configurer la localisation :
header('Content-type: text/html; charset=UTF-8') ;Sur Windows, le nom de la locale diffère de celui pour Linux. Il faut donc le configurer selon l'environnement de production sur lequel le script s'exécutera. Référez-vous à la liste des langues de la documentation des librairies C++ sur MSDN.
date_default_timezone_set('America/Montreal');
// PHP Linux
setlocale(LC_ALL, 'fr_CA');
// PHP Windows
setlocale(LC_ALL, 'frc');
// ou
setlocale(LC_ALL, 'french-canadian');
Ensuite, on utilise la fonction PHP strftime() qui fait toute la magie pour nous.
$mydate = '2009-04-01';À cause de la librairie C++ de Windows, le paramètre de format %e ne fonctionnera pas. On devra se rabattre sur %d (Windows seulement) pour faire afficher le numéro du jour avec un zéro devant les neuf premiers jours du mois (01 avril plutôt que 1 avril).
// format "mercredi, 1 avril 2009"
$dt = strftime("%A, %e %B %Y", strtotime($mydate));
// convertir les accents (pour encodage UTF-8)
$dt = mb_convert_encoding($dt, 'utf-8');
echo $dt;
Pour une raison qui m'échappe, l'affichage textuel de la date en anglais place des lettres capitales pour chaque mot alors qu'en français, tout est en minuscule. On pourra y remédier avec la fonction ucwords().
// mercredi, 1 avril 2009 => Mercredi, 1 Avril 2009Zend Framework
echo ucwords($dt);
Comme nous avons vu et compris la mécanique qui s'opère en PHP pur, il faut maintenant savoir que le ZF offre des classes pour faire exactement la même chose en orienté objet.
require_once('Zend/Locale.php');Ici, le format du jour sera automatiquement corrigé (01 avril => 1 avril) pour le PHP Windows.
require_once('Zend/Date.php');
header('Content-type: text/html; charset=UTF-8') ;
date_default_timezone_set('America/Montreal');
$locale = new Zend_Locale('fr_CA');
// utiliser le format de date PHP
Zend_Date::setOptions(array('format_type' => 'php'));
$mydate = '2009-04-01';
$date = new Zend_Date($mydate, Zend_Date::ISO_8601);
$dt = $date->toString('l, j F Y', $locale);
echo ucwords($dt);
En français on n'écrit pas le nom des mois et des jours en majuscule sauf en début de phrase. De même pour les langues 'français => French'.
Le premier exemple avec la majuscule est pour un contexte où on affiche un calendrier avec le nom du mois en entête. L'idée est de stocker le nom du mois ou du jour et de faire la transformation de la casse selon ce qu'on veut afficher. Dans ton cas, utilises ucfirst().
Une méthode simple pour utiliser les Zend Date est de faire des fonction spécifique dans ses objets métiers ce qui permet de mettre en paramètre de
cette fonction le format de la date . Vous pouvez trouver un bon exemple à cette adresse http://www.pylejeune.fr/framework/utiliser-les-date-avec-zend_date/