6.Le langage PHP

6.10.Les dates

6.10.1.Manipulation de dates

6.10.1.Introduction :

Vous serez peut-être amenés à manipuler des dates (pour gérer des caches par exemple). Je m'en vais donc tenter de répondre à 99% des questions que vous vous posez (je garde 1% en réserve ;-) ).

6.10.1.La fonction time :

La fonction time() est probablement la fonction qui parle le moins à nous autres humains puisqu'elle retourne le nombre de secondes écoulées depuis le 1er Janvier 1970 (epoch). Par contre, elle est très souvent utilisée lors des manipulations de dates.
<?php
echo "Il s'est écoulé ". time() . " secondes depuis le 1er Janvier 1970";
?>

6.10.1.Convertir une date quelconque en nombre de secondes depuis le 1er janvier 1970

Pour convertir une date quelconque en nombre de secondes depuis le 1er Janvier 1970, nous avons la fonction mktime() dans laquelle on précise, l'heure, la minute, la seconde, le mois, le jour, l'année.
Attention: L'ordre des paramètres est à l'américaine mois,jour,année et non jour,mois,année.
<?php
 echo "Noël 2000 c'était il y a ". mktime(0,0,0,12,25,2000) . " secondes ";
?>
Exemple:
Noël 2000 c'était il y a 977698800 secondes
(Initialement, je voulais mettre le nombre de secondes depuis que l'homme à marché sur la lune, mais ils y sont parvenus quelques mois trop tôt (avant 1970))
mktime() se décline en gmmktime() qui donne le résultat pour la date GMT à partir d'une date définie localement.

6.10.2.Contrôler la validité d'une date

Pour contrôler la validité d'une date issue, par exemple d'un formulaire, vous pouvez avoir recours à la fonction checkdate(). Fini les 31 Février et autres 35 Décembre.
<?php
  $mois  = 12;
  $jour  = 35;
  $annee = 2001;
  if (checkdate($mois, $jour, $annee)) {
    echo "La date $jour/$mois/$annee existe bien";
  } else {
    echo "La date $jour/$mois/$annee n'est pas valide";
  }
?>
Attention: L'ordre des paramètres est à l'américaine mois,jour,année et non jour,mois,année.

6.10.3.Affichage d'une date

Pour afficher une date, vous pouvez utiliser la fonction strftime avec pour paramètre une chaîne de caractères indiquant le format sous lequel vous voulez représenter la date.
<?php
echo "Affichage au format jour/mois/annee heure:minute:seconde ".
      strftime("%d/%m/%y %H:%M:%S")."<br />";
?>
Exemple:
Affichage au format jour/mois/annee heure:minute:seconde 07/06/17 11:37:05
Comme vous pouvez le constater, le format est donné par une chaîne de caractères comportant quelques caractères précédés d'un signe % ayant une signification particulière (d pour jour, m pour mois, y pour année, etc...) et des caractères choisis librement (ici, le slash, l'espace, les 2 points). Donc à partir du moment où vous connaissez les lettres "clées", vous pouvez donner libre court à votre imagination.
Liste des principales lettres "clées":
  • %y - année (sur 2 chiffres)
  • %Y - année
  • %B - mois en toutes lettres
  • %m - mois
  • %A - jour en toutes lettres
  • %d - jour
  • %u - numéro du jour dans la semaine (1=Lundi)
  • %H - heure (sur 24 heures)
  • %I - heure (sur 12 heures)
  • %M - minute
  • %S - seconde
  • %j - numéro du jour dans l'année
  • %V - numéro de la semaine dans l'année
  • %% - pourcent
Pour plus de détails consulter la documentation officielle de PHP
Par défaut la fonction strftime() formatte la date et heure courante mais vous pouvez spécifier un second paramètre pour afficher une autre date. Ce paramètre étant exprimé en secondes depuis le 1 Janvier 1970.
<?php
echo "Dans 15 jours nous serons le " . strftime("%d/%m/%y",time()+15*24*3600) . "<br>";
?>
Exemple:
Dans 15 jours nous serons le 22/06/17
<?php 
setlocale(LC_TIME,"fr_FR");
echo "Le 14 Juillet 2001 tombe un " . strftime("%A",mktime(0,0,0,7,14,2001));
?>
Exemple:
Le 14 Juillet 2001 tombe un samedi
strftime() se décline en gmstrftime() qui affiche la date GMT à partir d'une date définie localement. La fonction date() a à peu près le même role que strftime() mais est moins complète et ne permet pas de clairement différencier le texte, proprement dit, des caractères "clés". Toutefois, les caractères "clés" diffèrent. date() se décline également en gmdate() qui affiche la date GMT à partir d'une date définie localement.
Si vous voulez afficher le jour ou le mois en toutes lettres, vous riquez de l'avoir en anglais. Si ce n'est pas ce que vous désirez, alors, il convient d'utiliser la commande setlocale() afin de préciser la langue d'affichage.
<?php
setlocale(LC_TIME,"en_US");
echo "En anglais " . strftime("%A %d %B %Y") . "<br />";
setlocale(LC_TIME,"fr_FR");
echo "En français " . strftime("%A %d %B %Y") . "<br />";
?>
Exemple:
En anglais mercredi 07 juin 2017
En français mercredi 07 juin 2017
La langue est définie par 2 lettres (généralement) suivies d'un underscore puis 2 autres lettres. Les premières lettres indiquant la langue proprement dit et les 2 suivantes le pays (on peut ainsi distinguer fr_FR de fr_CA même si dans le cas présent il n'y a pas de différences).

6.10.4.Le temps à la microseconde près

Il est également possible de récupérer la date à la microseconde près (ceci dit, il est probable que cette fonctionnalité ne soit pas disponible sous Windows - je n'ai pas vérifié) en utilisant la fonction gettimeofday().
<?php
$tableau = gettimeofday();
echo "Il s'est écoulé ".$tableau['sec']." secondes et ".
     $tableau['usec']." microsecondes depuis le 1er Janvier 1970.<br />";
?>
Exemple:
Il s'est écoulé 1496828225 secondes et 310219 microsecondes depuis le 1er Janvier 1970.
Ce qui permet par exemple d'estimer le temps d'execution d'une instruction.
<?php
  $top0 = gettimeofday();
  echo "Combien de temps pour afficher ce message ?<br>";
  $top1 = gettimeofday();
  
  $duree["sec"]  = $top1["sec"]-$top0["sec"];
  $duree["usec"] = $top1["usec"]-$top0["usec"];
  
  if ($duree["usec"]<0) {
  	$duree["sec"]--;
  	$duree["usec"]+=1000000;
  }

  echo "Il a fallu ".$duree["sec"]." secondes et ".
       $duree["usec"]." microsecondes<br />";
?>
Exemple:
Combien de temps pour afficher ce message ?
Il a fallu 0 secondes et 25 microsecondes
Cette fonction à la particularité de stocker l'information dans un tableau, ce qui est également le cas des fonctions localetime() et getdate().

6.10.5.Tout le reste n'est que mathématiques

Voilà, vous savez maintenant, manipuler les fonctions essentielles à la gestion des dates et heures. Il ne vous reste plus qu'à savoir compter et avoir un peu d'imagination.
Quelle est la date du prochain Samedi ?
<?php
// Aujourd'hui quel jour sommes nous ?
$jour=strftime("%u");
// Samedi (6ème jour de la semaine) c'est dans combien de jour ?
$delta=6-$jour;
if ($delta<0) $delta+=7;
// 1 heure=3600s, 1 jour=24h=24*3600s
echo "Samedi prochain c'est le " . strftime("%d/%m/%y",time()+$delta*24*3600);
?>
Exemple:
Samedi prochain c'est le 10/06/17

6.10.6.Les dates issues de MySQL

Lorsque vous récupérez la valeur d'un champs date (de type DATE) issu d'une base de données MySQL, celle-ci est par défaut formattée selon le schéma suivant : AAAA-MM-JJ (année sur 4 chiffres, un tiret, mois sur 2 chiffres, un tiret, jour sur 2 chiffres).
Pour la transformer en nombre de secondes depuis le 1er Janvier 1970 (Epoch) il suffit de faire appel à strtotime().
<?php
 // Nous supposons, ici, que suite à une requête SQL (MySQL) 
 // et après lecture du résultat par exemple avec
 //   $row = mysql_fetch_array($result);
 //   $date = $row["champdate"];
 // nous avons $date = "2002-02-01";
 $date = "2002-02-01";
 echo "Le timestamp de la date (DATE) récupérée en BD est ".
       strtotime($date);
 echo "<br />";

 // Autre date...
 $date = "2002-02-01 10:23:30";
 echo "Le timestamp de la date (DATETIME) récupérée en BD est ".
       strtotime($date);

 // Il suffit alors d'appeler les fonctions vues précédemment pour
 // manipuler cette information comme bon vous semble
?>
Exemple:
Le timestamp de la date (DATE) récupérée en BD est 1012518000
Le timestamp de la date (DATETIME) récupérée en BD est 1012555410
Cela est également valable pour une date au format AAAAMMJJ mais ne l'est plus pour un champ de type TIMESTAMP issu d'une base de données MySQL, celle-ci est par défaut formattée selon le schéma suivant : AAAAMMJJHHMMSS (année sur 4 chiffres, mois sur 2 chiffres, jour sur 2 chiffres, heure sur 2 chiffres, minutes, secondes sur 2 chiffres).
Pour les manipuler, il faut commencer par récupérer chaque élément de la date, pour cela, on peut utiliser la fonction explode() de la façon suivante.
<?php
 // connexion à la base non décrit ici
 // execution de la requête non décrit ici
 $row = mysql_fetch_array($result);
 // astuce comme une autre
 // on intercale des tirets tous les 2 caractères
 $elementsdate = chunk_split($row["champdate"], 2, "-");
 $elementsdate = explode("-", $elementsdate);
 echo "Année=" . $elementsdate[0] . $elementsdate[1] . "<br/>";
 echo "Mois=" . $elementsdate[2] . "<br/>";
 echo "Jour=" . $elementsdate[3] . "<br/>";
 echo "Heure=" . $elementsdate[4] . "<br/>";
 echo "Minutes=" . $elementsdate[5] . "<br/>";
 echo "Secondes=" . $elementsdate[6] . "<br/>";
 echo "Ce qui donne " . mktime($elementsdate[4],
                               $elementsdate[5],
                               $elementsdate[6],
                               $elementsdate[2],
                               $elementsdate[3],
                               $elementsdate[0].$elementsdate[1])
                      . " secondes depuis le 1er Janvier 1970";
?>
Ici vous pouvez apprendre :
Forum PHP
Version imprimable: imprimer