Pour les informaticiens, le temps n'est pas compté en secondes, minutes, heures, jours, mois et années, mais en nombre de secondes écoulées depuis le 1er janvier 1970 0h 0mn 0s (cette date arbitraire est parfois appelée ére UNIX). Le nombre de secondes écoulées depuis cette date est appelé timestamp ou parfois instant UNIX. Pour les dates antérieures aux 01/01/1970 00:00:00, le timestamp est négatif.

Sous Windows les fonctions de dates de PHP n'acceptent pas de paramètres négatifs. On ne peut donc pas y travailler avec des dates antérieures au 1/1/1970.

Le timestamp est stocké dans un entier signé de 32 bits, la date minimum qu'il est possible d'y stocker est le vendredi 13 décembre 1901 20:45:54, et la date maximum est le mardi 19 janvier 2038 03:14:07 (la fin du monde pour l'ère UNIX).

Toutes les fonctions de calcul de dates dans PHP sont basées sur ce timestamp. La fonction time() renvoie le timestamp de l'instant présent.

Exemple : le timestamp de l'instant
<?php require('bib_fonctions.php'); htmlDebut('Le timestamp de l\'instant'); htmlInfo('A cet instant nous sommes le'); echo time(),' secondes de l\'ére UNIX'; htmlInfo('Nombre d\'heure depuis le 1/1/1970'); echo round(time() / 3600); htmlInfo('Nombre de jours depuis le 1/1/1970'); echo round(time() / 3600 / 24); htmlFin(); ?>

La fonction htmlInfo() est une fonction qui se trouve dans la bibliothèque bib_fonctions.php et qui est un facilitateur (helper) pour afficher ce que vous faisions avant avec echo '<h4>bla bla bla</h4>';

Comme la valeur du timestamp n'a aucune signification directement utilisable par un être humain, PHP offre plusieurs fonctions qui permettent d'extraire les éléments constitutifs d'une date (année, mois, jour, heure, minutes, semaine, etc.)
Nous étudierons ici les deux fonctions les plus utilisées : getdate() et date(). Ces deux fonctions travaillent à partir du timestamp de la date à traiter, et renvoient les éléments constitutifs de cette date selon les paramètres d'extraction qui leurs sont passés.

### Obtenir une date avec getdate()

La fonction getdate() retourne un tableau associatif contenant divers éléments constitutifs de la date passée en paramètre. La date passée doit être un timestamp valide. En l'absence de ce paramètre, c'est le timestamp "actuel" qui est utilisé par la fonction.

Le tableau associatif retourné est composé des clés :

seconds
  : les secondes de 0 à 59
minutes
  : les minutes de 0 à 59
hours
  : les heures de 0 à 23
mday
  : le numéro du jour dans le mois de 1 à 31
wday
  : le nom du jour de la semaine de 0 (dimanche) à 6 (samedi)
mon
  : le numéro mois de 1 à 12
year
  : l'année sur 4 chiffres
yday
  : le jour de l'année de 1 à 366
weekday
  : le nom du jour de la semaine en anglais
month
  : le nom du mois en anglais
0
  : le timestamp de la date

Exemple : la fonction getdate()
<?php require('bib_fonctions.php'); htmlDebut('La fonction getdate()'); htmlInfo('getdate avec la date du jour'); $t = getdate(); echo '<pre>', print_r($t, true), '</pre>'; htmlInfo('Mise en forme des éléments'); echo 'Nous sommes le ', $t['mday'], '-', $t['mon'], '-', $t['year']; echo ' et c\'est le ', $t['yday'], 'eme jour de l\'année'; htmlFin(); ?>

### Obtenir une date avec date()

La fonction date() est sans doute la fonction la plus utilisée pour traiter la récupération et l'affichage d'éléments de dates. Cette fonction accepte deux arguments :

- une chaîne de caractères indiquant les parties de la date à prendre en compte,
- le timestamp de la date à traiter. En l'absence de ce paramètre, c'est le timestamp "actuel" qui est utilisé par la fonction.

Les nombreux élements que peut retourner la fonction date() sont définis chacun par un caractère alphabétique, en minuscule ou en majuscule. Nous les étudierons en 2 fois : d'abord ceux premettant la mise en forme des heures, puis ceux permettant la mise en forme des dates proprement dites.

Les caractères suivants sont utilisés pour extraire les éléments concernant les heures (attention à bien respecter les majucules et les minuscules) :

g
  : heure au format 2h ("1" à "12")
h
  : heure au format 12h ("01" à "12")
G
  : heure au format 24h ("0" à "23")
H
  : heure au format 24h ("00" à "23")
T
  : fuseau horaire de la machine ("MET")
B
  : heure Internet Swatch
O
  : différence d'heures avec Greenwich (i.e. "+0200")
i
  : minutes ("00" à "59")
s
  : secondes ("00" à "59")
a
  : indiquera "am" (matin) ou "pm" (après-midi)
A
  : indiquera "AM" (matin) ou "PM" (après-midi)
I
  : "1" si l'heure d'été est activée, "0" sinon
U
  : Nombre de secondes depuis le 1er Janvier 1970, 0h00 00s GMT
Z
  : décalage horaire en secondes (de "-43200" à "43200")
r
  : date au format RFC 822 ("Thu, 21 Dec 2000 16:01:07 +0200")

Exemple : la fonction date() et les heures
<?php require('bib_fonctions.php'); htmlDebut('La fonction date() et les heures'); htmlInfo('Heure actuelle au format 00:00:00'); echo date('H:i:s', time()); htmlInfo('Heure d\'été ou heure d\'hiver'); if (date('I', time()) == 1) { echo 'Heure d\'été'; } else { echo 'Heure d\'hiver'; } htmlInfo('Heure actuelle au format 0h 00m 00s AM'); echo date('g\h i\m s\s A'); htmlFin(); ?>

Vous noterez que la chaîne de caractères utilisée pour extraire les éléments peut contenir des caractères spéciaux et des autres caractères. Les autres caractères doivent être protégés avec un \ pour que la fonction ne les interprète pas comme un caractère d'extraction. Dans l'exemple nous avons :
date('g\h i\m s\s A', time());
qui renvoie quelque chose comme 8h 25m 32s PM
date('g \h\e\u\r\e\s i \m\i\n s \s\e\c. A', time());
renverrait 8 heures 25 min 32 sec PM.

Les caractères suivants sont utilisés pour extraire les éléments concernant les dates proprement dites (attention à bien respecter les majucules et les minuscules).

Pour les jours nous avons :

d
  : numéro du jour dans le mois sous la forme "01" à "31"
j
  : numéro du jour dans le mois sous la forme "1" à "31"
D
  : nom abrégé du jour de la semaine en anglais (i.e. "Fri" pour Vendredi)
l
  : nom complet du jour de la semaine anglais (i.e. "Friday" pour Vendredi)
S
  : suffixe ordinal d'un nombre, 2 lettres en anglais ("th", "nd")
t
  : nombre de jours dans le mois (i.e. "28" à "31")
w
  : numéro du jour dans la semaine, de "0" (Dimanche) à "6" (Samedi)
z
  : numéro du jour dans l'année, de "0" "365"

Pour les mois nous avons :

m
  : numéro du mois sous la forme "01" à "12"
n
  : numéro du mois sous la forme "1" à "12"
M
  : nom abrégé du mois en anglais (i.e. "Apr" pour Avril)
F
  : nom complet du mois en anglais (i.e. "January" pour Janvier)

Pour les années nous avons :

L
  : booléen année bissextile ("1") ou pas ("0")
Y
  : année sur 4 chiffres (i.e. "1999")
y
  : année sur 2 chiffres (i.e. "99")

Exemple : la fonction date()
<?php require('bib_fonctions.php'); htmlDebut('La fonction date()'); htmlInfo('La date actuelle au format jj/mm/aaaa'); echo date('d/m/Y', time()); htmlInfo('Année bissextile ?'); echo date('L', time()) ? 'Oui' : 'Non'; htmlInfo('Nombre de jour dans le mois'); echo date('t', time()); htmlInfo('Numéro du jour dans l\'année'); echo date('z', time()), 'éme jour de l\'année'; htmlFin(); ?>

Pour afficher une date entièrement en français, le plus simple est d'utiliser un tableau avec le nom des jours et un tableau avec le nom des mois.

Exemple : date en français
<?php require('bib_fonctions.php'); htmlDebut('La fonction date()'); // Tableau des jours $jours = array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'); // tableau des mois $mois = array('', 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'); // Timestamp du jour $t = time(); echo 'Nous sommes le ', $jours[date('w', $t)], ' ', date('j', $t), ' ', $mois[date('n', $t)], ' ', date('Y', $t); htmlFin(); ?>

### Vérifier qu'une date est correcte

PHP fournit la fonction checkdate() pour vérifier qu'une date est une date valide et correcte. La fonction accepte comme paramètre le mois, le jour et l'année de la date à vérifier, et renvoie TRUE si la date représentée est valide. Les années bissextiles sont prises en compte.

Exemple : vérifier une date
<?php require('bib_fonctions.php'); htmlDebut('Vérifier une date'); htmlInfo('Le 1/1/2000 est une date'); if (checkdate(1, 1, 2000)) { echo 'valide'; } else { echo 'invalide'; } htmlInfo('Le 1/13/2000 est une date'); echo checkdate(13, 1, 2000) ? 'valide' : 'invalide'; htmlInfo('Le 29/2/2004 est une date'); echo checkdate(2, "29", 2004) ? 'valide' : 'invalide'; htmlInfo('Le 29/2/2100 est une date'); echo checkdate(2, 29, 2100) ? 'valide' : 'invalide'; htmlFin(); ?>