PHP - MySQL [Retour au menu]
Gestion des dates

La fonction date, d, m, y, calcul sur une valeur de date, date de modification de fichiers avec filemtime, timestamp

Gestion de la date du jour

C'est la fonction date qui permet de récupérer la date du jour :

echo date("d/m/y");

Il est très possible d'attribuer une valeur de date à une variable et de faire des calculs dessus :

$Annee = date("y");
$Annee = $Annee + 1;
echo "$Annee";

Afficherait 3 si on était en 2002.

Voici les lettres utilisées :

  1. a - "am" (matin) ou "pm" (après-midi)
  2. A - "AM" (matin) ou "PM" (après-midi)
  3. B - Heure Internet Swatch
  4. d - Jour du mois, sur deux chiffres (éventuellement avec un zéro) : "01" à "31"
  5. D - Jour de la semaine, en trois lettres (et en anglais) : par exemple "Fri" (pour Vendredi)
  6. F - Mois, textuel, version longue; en anglais, i.e. "January" (pour Janvier)
  7. g - Heure, au format 12h, sans les zéros initiaux i.e. "1" à "12"
  8. G - Heure, au format 24h, sans les zéros initiaux i.e. "0" à "23"
  9. h - Heure, au format 12h, "01" à "12"
  10. H - heure, au format 24h, "00" à "23"
  11. i - Minutes; "00" à "59"
  12. I (i majuscule) - "1" si l'heure d'été est activée, "0" si l'heure d'hiver .
  13. j - Jour du mois sans les zéros initiaux: "1" à "31"
  14. l - ('L' minuscule) - Jour de la semaine, textuel, version longue; en anglais, i.e. "Friday" (pour Vendredi)
  15. L - Booléen pour savoir si l'année est bissextile ("1") ou pas ("0")
  16. m - Mois; i.e. "01" à "12"
  17. M - Mois, en trois lettres (et en anglais) : par exemple "Apr" (pour Avril)
  18. n - Mois sans les zéros initiaux; i.e. "1" à "12"
  19. O - Différence d'heures avec l'heure de Greenwich, exprimée en heures; i.e. "+0200"
  20. r - Format de date RFC 822; i.e. "Thu, 21 Dec 2000 16:01:07 +0200" (ajouté en PHP 4.0.4)
  21. s - Secondes; i.e. "00" à "59"
  22. S - Suffixe ordinal d'un nombre, en anglais, sur deux lettres : i.e. "th", "nd"
  23. t - Nombre de jours dans le mois donné, i.e. "28" à "31"
  24. T - Fuseau horaire de la machine ; i.e. "MET"
  25. U - Secondes depuis une époque
  26. w - Jour de la semaine, numérique, i.e. "0" (Dimanche) to "6" (Samedi)
  27. Y - Année, 4 chiffres; i.e. "1999"
  28. y - Année, 2 chiffres; i.e. "99"
  29. z - Jour de l'année; i.e. "0" à "365"
  30. Z - Décalage horaire en secondes (i.e. "-43200" à "43200")

Récupération de la date de dernière modification d'un fichier

filemtime est une fonction qui renvoie la date de modiufication d'un certain fichier sous la forme d'un nombre entier. Soit un fichier MonTexte.txt se trouvant dans le dossier racine :

echo (filemtime("MonTexte.txt"))

Renvoie 1028983194

Il s'agit de transformer cette valeur en date et heure. La fonction date possède un 2ème paramètre optionnel qui correspond à une valeur entière telle que 1028983194, et se charge de la mettre en forme. Si ce paramètre est omis, la date et heure courante sont rnvoyés.

Nous allons utiliser D, j, M, Y, G, i, s comme paramètre principal de date pour obtenir la date et l'heure. Cette instruction renvoie la date et l'heure courante
echo (date("D, j.M.Y H:i:s"));

Sous cette forme :
Sat, 10.Aug.2002 19:32:37

Maintenant, ajoutons un nombre a convertir en date/heure, justement le nombre 1028983194 :
echo (date("D, j.M.Y H:i:s", 1028983194));

qui donne :
Sat, 10.Aug.2002 14:39:54

Et ce nombre 1028983194 est en fait donc issu de filemtime("MonTexte.txt"). Nous allons tout naturellement remplacer 1028983194 par filemtime("MonTexte.txt"):

echo (date("D, j.M.Y H:i:s", filemtime("MonTexte.txt")));

Principe du TimeStamp

Le TimeStamp représente le nombre de secondes écoulées depuis le premier janvier 1970. Pour donner un ordre d'idées, à 30 ans et 8 mois environs, vous fêtez votre milliardième seconde de vie sur cette terre. En d'autre mot, si nous étions en août 2000, le Timestamp serait de 1 milliard environ.

On peut obtenir ce TimeStamp depuis la fonction mktime. mktime accepte comme paramètre dans cet ordre précis :

mktime (Heures, Minutes, Secondes, Mois, Jour, Année)

Ainsi, si on écrit :

echo mktime (0, 0, 0, 8, 1, 2000);

(le premier août 2000, à minuit pile), nous obtiendrons le chiffre suivant :

965'080'800

Soit un peu plus de 965 millions de secondes, et donc presque un milliard. Ce qui est particulièrement intéressant avec cette fonction, c'est que vous pouvez installer des paramètres qui peuvent paraître étranges au premier abord : Cette ligne de code devrait planter :

echo mktime (0, 0, 0, 49, 1, 2000);

Puisqu'on demande le nombre de secondes écoulées jusqu'au 1.49.2000 (soit le 49ème mois de l'année 2000), mais il renvoie correctement :

1'072'911'600

Et ce qu'on pourrait consirérer comme un "bug" va finalement nosu faciliter la vie. Par exemple, imaginons que nous voulions récupérer une date en avance de 3 mois sur la date actuelle : admettons que nous soyons le 8.11.2002 : avec le TimeStamp de mktime, nous n'allons pas nous casser la tête à essayer de voir s'il intervient un changement d'année : Nous allons bêtement demander le 14ème mois de l'année 2002, qu'il va sagement transformer en février 2003, sans broncher.

Nous avons vu plus haut la fonction date avec des paramètres de formatage. Pour reccueillir le mois actuel, nous écririons :

date("m")

qui va, dans notre cas, renvoyer donc : 11. Ainsi, si nous demandons un affichage tel que :

echo date("m")+3;

Il va donc renvoyer 14. C'est donc ce chiffre que nous allons stocker :

echo mktime(0 , 0 , 0 , date("m")+3 , date("d") , date("Y"));

Va vonc nous renvoyer le nombre de secondes entre le 1.1.1970 et le 8.14.2002 - ou plutôt en fait le 8.2.2003. Et le plus fort vient maintenant : Nous allons REconvertir ce nombre de secondes en date "normale", grâce à la précieuse fonction date qui accepte donc 2 paramètres : Le format, et un TimeStamp :

echo date("d.m.Y" , mktime(0,0,0,date("m")+3,date("d"),date("Y")));

qui va afficher

8.2.2003

Comparaison de dates

Le TimeStamp va nous aider à comparer des dates. Deux fonctions sont particulièrement intéressantes :

mktime et strtotime

mktime

mktime va nous permettre de transformer précisément une date ou date/heure en TimeStamp. mktime accepte 6 paramètres :

Heure, Minute, Seconde, Mois, Jour, Année

echo mktime(0 , 0 , 0 , date("m") , date("d") , date("Y"))

Va nous envoyer le TimeStamp d'aujourd'hui, à Minuit 0 minutes 0 secondes

strtotime

strtotime va nous permettre d'obtenir un TimeStamp sans avoir besoin d'analyser en précision la chaîne de caractère censée contenir une date, car cette fonction comprend bien plusieurs formes de dates, comme par exemple :

echo strtotime("now");
echo strtotime("10 September 2000");
echo strtotime("+1 day");
echo strtotime("+1 week");
echo strtotime("+1 week 2 days 4 hours 2 seconds");

Utilisation de la combinaison des deux fonctions

Admettons qu'on veuille comparer une date contenue dans une variable à la date d'aujourd'hui, et déterminer si elle est postérieure ou antérieure : Soit la variable $DateExpiration qui contient : 2003-12-31

if (strtotime($DateExpiration) - mktime(0 , 0 , 0 , date("m") , date("d") , date("Y"))) < 0
  echo "La date d'expiration est dépassée"

Pour terminer, voici une fonction personnalisée qui permet d'afficher une date d'apparence
2006-4-18
en
Mardi 18 Avril 2006 :

function DateConviviale($QuelleDate)
  {
  $NomJour = date("D", strtotime($QuelleDate));
  $Jour = date("j", strtotime($QuelleDate));
  $NomMois = date("M", strtotime($QuelleDate));
  $Annee = date("Y", strtotime($QuelleDate));

  // Nom du jour en toutes lettres :
  switch ($NomJour)
    {
    case "Mon": $NomJour = "Lundi"; break;
    case "Tue": $NomJour = "Mardi"; break;
    case "Wed": $NomJour = "Mercredi"; break;
    case "Thu": $NomJour = "Jeudi"; break;
    case "Fri": $NomJour = "Vendredi"; break;
    case "Sat": $NomJour = "Samedi"; break;
    case "Sun": $NomJour = "Dimanche"; break;
    }

  // Nom du mois en toutes lettres :
  switch ($NomMois)
    {
    case "Jan": $NomMois = "Janvier"; break;
    case "Feb": $NomMois = "Février"; break;
    case "Mar": $NomMois = "Mars"; break;
    case "Apr": $NomMois = "Avril"; break;
    case "May": $NomMois = "Mai"; break;
    case "Jun": $NomMois = "Juin"; break;
    case "Jul": $NomMois = "Juillet"; break;
    case "Aug": $NomMois = "Août"; break;
    case "Sep": $NomMois = "Septembre"; break;
    case "Oct": $NomMois = "Octobre"; break;
    case "Nov": $NomMois = "Novembre"; break;
    case "Dec": $NomMois = "Décembre"; break;
 
  }
  return $NomJour." ".$Jour." ".$NomMois." ".$Annee;
  }