La Date en Français avec PHP

Cet article va nous permettre de formater une date en français textuel à l'aide d'une fonction PHP que nous allons créer.
Ainsi, nous pourrons par exemple écrire "article posté le Mardi 5 décembre 2006" sur nos belles pages.

Cette méthode peux paraître 'lourde' aux yeux de certains mais je la privilégie car elle utilise exactement la même syntaxe que la fonction date() ce qui permet son utilisation sans pour autant devoir modifier beaucoup de code dans le cas où l'on utilise déja la fonction date().

La fonction date() de PHP

Cette fonction nous sera très utile, je vous invite donc à vous documenter sur le site de php.net.

Sa syntaxe est la suivante :

date("format",timestamp)

Le Format est une série de caractères qui spécifie ce que l'on souhaite, par exemple d pour le numéro du jour (de 01 à 31) ou m pour le numéro du mois. (voir la liste sur php.net).

Le Timestamp est le nombre de seconde depuis le 1er janvier 1970, c'est en fait la date que l'on souhaite afficher (par exemple récupérée dans une base de données). S'il n'est pas renseigné, la fonction date() utilise la date actuelle.

Pour obtenir le timestamp actuel, il faut utiliser la fonction time().

Sachant cela, nous savons déja formater une date (dans l'exemple, timestamp correspond au 10 mars 2007):

echo date("d-m-y",timestamp);           // 10-03-07
echo date("d/m/Y H:i:s",timestamp);     // 10/03/2007 15:25:37
echo date("l d F Y à H:i:s",timestamp); // Saturday 10 March 2007 à 15:25:37

Etude du problème

Nous remarquons que le fonction date() fait le plus gros du travail. Le seul problème est que le texte retourné est en anglais.

Nous allons donc faire une fonction qui utilisera la fonction date() et ensuite 'traduire' le texte créé en français.

Nous appellerons notre fonction date_fr() et allons lui donner la même syntaxe d'utilisation que la fonction date() de php.

Ainsi nous ne devrions que remplacer date() par date_fr() dans nos codes sources php.

Notre fonction date_fr()

Dans un premier temps, nous allons simplement récupérer les paramètres afin d'avoir notre date formatée en Anglais.

function date_fr($format,$timestamp=false) {
  if ( !$timestamp )
    $date_en = date($format);
  else
    $date_en = date($format,$timestamp);
  // ...
}

$date_en contient maintenant la chaine retournée par date(). Nous allons donc la 'traduire' en français.

Pour se faire, nous allons utiliser la fonction str_replace() de php.

Cette fonction requiert 3 paramètres:

  • Le texte à chercher,
  • Le texte qui remplace,
  • La chaine que l'on veut modifier.
str_replace("anglais","français","Une phrase en anglais.")

Après exécution, cette exemple retournera "Une phrase en français".

Nous allons donc créer 2 tableaux (array) qui contiendront la série des jours et mois dans chacunes des langues et les utiliser avec str_replace.

$texte_en = array(
    "Monday", "Tuesday", "Wednesday", "Thursday",
    "Friday", "Saturday", "Sunday", "January",
    "February", "March", "April", "May",
    "June", "July", "August", "September",
    "October", "November", "December"
);
$texte_fr = array(
    "Lundi", "Mardi", "Mercredi", "Jeudi",
    "Vendredi", "Samedi", "Dimanche", "Janvier",
    "Février", "Mars", "Avril", "Mai",
    "Juin", "Juillet", "Août", "Septembre",
    "Octobre", "Novembre", "Décembre"
);

Ensuite le remplacement de texte :

$date_fr = str_replace($texte_en,$texte_fr,$date_en);

Voici notre date en français, par contre les jours et mois générés en 3 caractères ne sont pas convertis.
Nous pouvons retravailler nos tableaux afin de les tronquer mais pour pas compliquer nous allons simplement refaire l'opération précédante avec ces jours et mois sur 3 caractères :

$texte_en = array(
    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
    "Aug", "Sep", "Oct", "Nov", "Dec"
);
$texte_fr = array(
    "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim",
    "Jan", "Fév", "Mar", "Avr", "Mai", "Jui", "Jui",
    "Aoû", "Sep", "Oct", "Nov", "Déc"
);

Nous refaisons la convertion et retournons le résultat.

Cette fois-ci nous devons travailler avec la chaîne de caractère $date_fr.

$date_fr = str_replace($texte_en,$texte_fr,$date_fr);

return $date_fr;

Pour résumer

Pour éviter des problèmes de jeux de caractère, nous allons remplacer les caractères accentués par leurs entitées html.

Le code final est donc le suivant :

function date_fr($format, $timestamp=false) {
    if ( !$timestamp ) $date_en = date($format);
    else               $date_en = date($format,$timestamp);

    $texte_en = array(
        "Monday", "Tuesday", "Wednesday", "Thursday",
        "Friday", "Saturday", "Sunday", "January",
        "February", "March", "April", "May",
        "June", "July", "August", "September",
        "October", "November", "December"
    );
    $texte_fr = array(
        "Lundi", "Mardi", "Mercredi", "Jeudi",
        "Vendredi", "Samedi", "Dimanche", "Janvier",
        "Février", "Mars", "Avril", "Mai",
        "Juin", "Juillet", "Août", "Septembre",
        "Octobre", "Novembre", "Décembre"
    );
    $date_fr = str_replace($texte_en, $texte_fr, $date_en);

    $texte_en = array(
        "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",
        "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
        "Aug", "Sep", "Oct", "Nov", "Dec"
    );
    $texte_fr = array(
        "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim",
        "Jan", "Fév", "Mar", "Avr", "Mai", "Jui",
        "Jui", "Aoû", "Sep", "Oct", "Nov", "Déc"
    );
    $date_fr = str_replace($texte_en, $texte_fr, $date_fr);

    return $date_fr;
}

C'est bien beau tous ça mais comment je fais si je n'ai pas ma date sous forme de timestamp ?

Il faut utiliser la fonction mktime() de php. Cette fonction converti une date en timestamp.

Utilisation

Des exemples sur l'utilisation de notre fonction date_fr() et de la fonction mktime() se trouvent sur cette page.

comments powered by Disqus