6.Le langage PHP

6.10.Les dates

6.10.2.Les fonctions natives PHP

6.10.2.4.Découper (i.e. parser) une chaîne de caractères représentant une date

6.10.2.4.1.Avec date_parse_from_format()

La fonction date_parse_from_format() propose de découper (parser) la chaîne de caractères représentant une date pour en retourner les éléments sous forme de tableau. A la différence de la fonction strToTime(), date_parse_from_format() ne cherche pas à deviner le format de la date. Il faut donc le lui préciser (dans le premier paramètre de l'appel à la fonction). Les mots clés permettant de préciser le format sont équivalents à ceux de la fonction date().
Il est alors possible de travailler avec des dates au format jour/mois/année.
<?php
$date = '01/11/2000 12:30';
$champsDate = date_parse_from_format('d/m/Y H:i', $date);
var_dump($champsDate);
?>
array(12) {
  ["year"]=>
  int(2000)
  ["month"]=>
  int(11)
  ["day"]=>
  int(1)
  ["hour"]=>
  int(12)
  ["minute"]=>
  int(30)
  ["second"]=>
  int(0)
  ["fraction"]=>
  float(0)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
}
Comme vous pouvez le constater, cette fonction retourne un tableau associatif avec les clés principales suivantes:
  • year pour l'année
  • month pour le mois
  • day pour le jour
  • hour pour l'heure
  • minute pour les minutes
  • second pour les secondes
  • error_count nombre d'erreurs (i.e. nombre de champs n'ayant pas pu être déterminés parmi ceux précisés dans le format de date)
  • errors tableau de messages d'erreur
rem
  • Pour une utilisation avec PHP<5.3 (i.e. ne proposant pas la fonction date_parse_from_format()) vous pouvez opter (sauf sous Windows et sauf pour PHP<5.1) pour la fonction strptime() décrite dans le chapitre suivant
  • date_parse_from_format() ne permet pas de découper une date sous forme de texte dans une "locale" (i.e. langue) donnée. Ce qui peut également vous amener à avoir recours à la fonction strptime() décrite dans le chapitre suivant

6.10.2.4.2.Avec strptime()

La fonction strptime() à l'avantage (par rapport à la fonction date_parse_from_format()) de permettre de manipuler des dates sous forme de texte en Français (comme "8 Novembre 2000"). Attention toutefois, cette fonction n'est pas disponible sous windows et la notice officielle de PHP déconseille l'utilisation de cette fonction du fait d'un comportement pouvant varier d'un environnement à l'autre.
strptime() prend 2 paramètres en entrées, le premier étant la date et le second le format. Dans, ce cas, le format est précisé avec les mêmes "mots clés" que la fonction strftime() vue précédemment.
<?php
setLocale(LC_TIME, 'fr_FR.utf8');
$date = 'Mercredi 1 Novembre 2000 20:30';
$champsDate = strptime($date, '%A %e %B %Y %H:%M');
var_dump($champsDate);
?>
Télécharger strptime.php

Ce qui donne:
array(9) {
  ["tm_sec"]=>
  int(0)
  ["tm_min"]=>
  int(30)
  ["tm_hour"]=>
  int(20)
  ["tm_mday"]=>
  int(1)
  ["tm_mon"]=>
  int(10)
  ["tm_year"]=>
  int(100)
  ["tm_wday"]=>
  int(3)
  ["tm_yday"]=>
  int(305)
  ["unparsed"]=>
  string(0) ""
}
Comme vous pouvez le constater, cette fonction retourne un tableau associatif avec les clés principales suivantes:
  • tm_year pour l'année moins 1900
  • tm_mon pour le mois moins 1
  • tm_mday pour le jour du moins
  • tm_hour pour l'heure
  • tm_min pour les minutes
  • tm_sec pour les secondes
  • tm_wday pour le jour de la semaine
  • tm_yday pour le jour de l'année
warning Attention, pour obtenir un résultat plus standard, il convient d'ajouter 1 au mois et 1900 à l'année
rem
  • Dans le cas d'une date avant 1900, la fonction reste valable et retournera simplement une valeur négative pour la clé tm_year

6.10.2.4.3.A la "main"

Pour des formats de date basiques, un découpage "à la main" peut parfois se révéler tout aussi efficace. Comme dans l'exemple suivant:
<?php
$date = '01/11/2000';
list($jour, $mois, $annee) = explode('/', $date);
echo 'Jour = '.$jour.', Mois = '.$mois.', Année = '.$annee;
?>
Télécharger explode.php

Ce qui donne:
Jour = 01, Mois = 11, Année = 2000

6.10.2.5.Convertir jour, mois, année, etc. en secondes depuis Epoch avec mktime() ou gmmktime()

Pour convertir, en nombre de secondes depuis Epoch (1er Janvier 1970 à 00:00:00 UTC), une date (pré-)découpée (comme dans le chapitre précédent), nous avons la fonction mktime() pour laquelle il suffit de préciser: l'heure, la minute, la seconde, le mois, le jour, l'année.
warning
  • L'ordre des paramètres n'est pas jour, mois, année mais mois, jour, année
  • C'est le fuseau horaire défini pour le script qui est utilisé pour réaliser la conversion. Ainsi, 2 serveurs (ou environnements PHP) configurés avec des fuseaux horaires différents retourneront des résultats différents
<?php
echo 'Noël 2000 00:00:00 (heure locale) c\'était '.mktime(0, 0, 0, 12, 25, 2000).
     ' secondes après le 1er Janvier 1970 00:00:00 (UTC)';
?>
Télécharger mktime.php

Ce qui donne:
Noël 2000 00:00:00 (heure locale) c'était 977698800 secondes après le 1er Janvier 1970 00:00:00 (UTC)
Utilisée avec la fonction de découpage (i.e. parsing) date_parse_from_format() cela donne
<?php
$date = '01/11/2000 12:30';
$champsDate = date_parse_from_format('d/m/Y H:i', $date);
$time = mktime($champsDate['hour'],
               $champsDate['minute'],
               $champsDate['second'],
               $champsDate['month'],
               $champsDate['day'],
               $champsDate['year']);
echo 'La chaîne ['.$date.'] convertie en seconde depuis Epoch puis'."\n".
     'en date lisible (format Français) donne: '.date('d/m/Y H:i:s', $time);
?>
La chaîne [01/11/2000 12:30] convertie en seconde depuis Epoch puis
en date lisible (format Français) donne: 01/11/2000 12:30:00
L'utilisation de mktime() suppose que la date passée en paramètre est donnée dans le fuseau horaire utilisé par le script PHP.
Alternativement, vous pouvez utiliser la fonction gmmktime() si vous souhaitez passer en paramètre une date donnée en heure GMT.
<?php
echo 'Noël 2000 00:00:00 (heure GMT) c\'était '.gmmktime(0, 0, 0, 12, 25, 2000).
     ' secondes après le 1er Janvier 1970 00:00:00 (UTC)';
?>
Télécharger gmmktime.php

Ce qui donne:
Noël 2000 00:00:00 (heure GMT) c'était 977702400 secondes après le 1er Janvier 1970 00:00:00 (UTC)
Notez la différence de 3600 secondes (donc 1h) avec le résultat donné par mktime() qui, lui, considérait le 25 décembre 2000 à 00:00:00 heure de Paris (et non heure GMT).
L'intervalle de dates permises par cette fonction dépend de l'environnement (le système d'exploitation, la version de PHP, etc.).
Les anciennes versions ne permettaient pas de manipuler des dates antérieures à 1970. Désormais c'est possible et en pareil cas, la fonction retournera simplement un nombre de secondes négatif.
<?php
echo 'Le premier pas sur la lune c\'était '.mktime(21, 17, 41, 7 , 20, 1969).
     ' secondes après le 1er Janvier 1970 00:00:00 (UTC)'."\n".
     'autant dire '.(-mktime(21, 17, 41, 7 , 20, 1969)).' secondes avant Epoch';
Télécharger mktime_avant_1970.php

Ce qui donne:
Le premier pas sur la lune c'était -14182939 secondes après le 1er Janvier 1970 00:00:00 (UTC)
autant dire 14182939 secondes avant Epoch
Pour vous donner une idée, nous avons pu constater ces différentes plages de fonctionnement:
  • Linux 64 bits avec PHP 7.1 (et PHP 5.6) entre 0101-01-01 00:00:00 (ce qui ne s'explique pas bien) et 292277026596-12-04 15:30:07 (ce qui correspond à un nombre de secondes = PHP_INT_MAX)
  • Window 7 avec PHP 5.4.45 (et Windows XP avec PHP 5.3.5) entre 1901-12-13 20:45:52 et 2038-01-19 03:14:07
En dehors de ces valeurs, la fonction gmmktime() retournera soit false (constaté sous windows), soit une valeur erronée (constaté sous linux). Là, encore ceci dépend de l'environnement.
Ici vous pouvez apprendre :
1.Introduction
2.Installation de PHP
3.Exécuter un script PHP
4.Configuration et environnement d'exécution de PHP
5.L'environnement de développement
6.Le langage PHP
6.1.Introduction
6.2.Mon premier script
6.3.La syntaxe
6.4.Les boucles (for, while, foreach, do) en PHP
6.5.Les tableaux (array) en PHP
6.6.Les fonctions
6.7.Include
6.8.Programmation orientée objet
6.9.Les fonctions de manipulation de tableaux
6.10.Les dates
6.10.1.Introduction
6.10.2.Les fonctions natives PHP
6.10.2.1.Déterminer la date et heure courante
6.10.2.2.Formatter (i.e. afficher/retourner) une date
6.10.2.3.Convertir une date quelconque en nombre de secondes depuis Epoch
6.10.2.4.Découper (i.e. parser) une chaîne de caractères représentant une date
6.10.2.4.1.Avec date_parse_from_format()
6.10.2.4.2.Avec strptime()
6.10.2.4.3.A la "main"
6.10.2.5.Convertir jour, mois, année, etc. en secondes depuis Epoch avec mktime() ou gmmktime()
6.10.2.6.Contrôler la validité d'une date
6.10.2.7.Le temps à la microseconde près
6.10.2.8.Mise en pratique
6.10.3.Les classes PHP
6.11.Fichiers et répertoires
6.12.Les paramètres d'entrée d'un script PHP
6.13.Utilisation de la librairie graphique
6.14.JpGraph pour tracer courbes et diagrammes
6.15.Utilisation de bases de données avec PHP
6.16.LDAP
6.17.Parser un document XML
6.18.Génération de documents PDF en PHP
6.19.Envoyer un mail
6.20.Créer un webmail avec IMAP
6.21.Droits utilisateurs: chmod 777
6.22.Localization (l10n) et Traduction
7.PHP pour le web
8.Internationalisation (i18n) et encodage en PHP
9.Créer un fichier de logs/traces
10.Déboguer une application PHP
11.Programmer en PHP en toute sécurité
12.Bibilothèque PEAR
13.Zend Framework 2 et 3
14.Installation de Zend Framework 2
15.Joomla
16.Composer
17.PHPUnit
18.PHPDocumentor
19.Mesure de temps d'exécution (benchmark) d'une fonction PHP
20.Exemples de scripts PHP
21.Erreurs fréquentes et les solutions
22.Archives
Version imprimable: imprimer