Aller au contenu

Programmation PHP/Dates

Un livre de Wikilivres.



La fonction date() créer une chaîne de caractère contenant la date du jour au format défini par son paramètre, selon la syntaxe suivante[1] :

  • Y (year) : année.
  • m (month) : mois.
  • M : nom des mois (en français si setlocale(LC_TIME, 'fr_FR');)
  • d (day) : jour.
  • w (week) : jour de la semaine sous forme d'un numéro.
0 dimanche
1 lundi
2 mardi
3 mercredi
4 jeudi
5 vendredi
6 samedi

Exemple :

echo date('Y-m-d'); // affiche 2016-07-10

À cela on peut rajouter les options d'horodatage les plus courantes :

  • a (ante meridiem ou post meridiem) : renvoie "am" le matin et "pm" l'après-midi.
  • h (hour) : heure de 0 à 12. À utiliser avec "a".
  • H (Hour) : heure de 0 à 24.
  • i (minute) : minute.
  • s (second) : seconde.

Exemple :

echo date('Y-m-d H:i:s'); // affiche 2016-07-10 20:06:34

Cette fonction transforme un texte (en anglais) en date[2].

Exemples courants :

$demain = date('Y-m-d', strtotime('+1 day'));
$hier = date('Y-m-d', strtotime('-1 day'));

Pour afficher la plage des dates de la semaine précédente[3] :

$previous_week = strtotime('-1 week +1 day');

$start_week = strtotime('last monday midnight', $previous_week);
$end_week = strtotime('next sunday', $start_week);

$start_week = date('Y-m-d', $start_week);
$end_week = date('Y-m-d', $end_week);

echo 'La semaine dernière était du '.$start_week.' au '.$end_week;
// Le vendredi 2016-07-29 cela affiche : La semaine dernière était du 2016-07-18 au 2016-07-24

Il est impératif dans un formulaire de vérifier si une date est au bon format. Pour ce faire il existe checkdate()[4] qui demande de séparer le mois, le jour puis l'année. Exemple :

var_dump(checkdate(0, 0, 2000)); // false
var_dump(checkdate(1, 1, 2000)); // true

Cette classe peut être instanciée en style POO ou en style procédural[5]. Exemple :

$date = new DateTime('2018-01-01');
echo $date->format('Y-m-d H:i:s');
// ou
$date = date_create('2018-01-01');
echo date_format($date, 'Y-m-d H:i:s');

Résultat : 2018-01-01 00:00:00.

Pour générer une date relative à l'actuelle :

 echo (new DateTime('now -2 days'))->format('Y-m-d H:i:s')

Pour date relative à une absolue :

 echo (new DateTime('2018-01-01 -2 days'))->format('Y-m-d H:i:s')

Elle possède également des méthodes pour modifier les dates :

  • Via une string : $date->modify('-1 day');
  • Via un objet de type DateInterval.
  • Pour modifier les heures, par exemple pour obtenir la date du jour à minuit : (new DateTime())->setTime(0, 0);.

La méthode DateTime::add() (et son alias date_add()), permet d'ajouter deux dates[6].

La méthode DateTime::diff() (et son alias date_diff()), permet de soustraire deux dates[7].

Exemple :

$date1 = new DateTime('2017-01-01');
$date2 = new DateTime('2020-11-01');
$dateInterval = $date2->diff($date1);
echo $dateInterval->format('%a jours');

Résultat : 1400 jours.

Conversion Timestamp en DateTime

[modifier | modifier le wikicode]
$date = new DateTime('@1676564671');

DateTimeImmutable

[modifier | modifier le wikicode]

Idem que DateTime mais immutable[8].

Cette classe gère les intervalles entre deux dates et est instanciée avec les paramètres suivants, sensibles à la casse :

  • P : period (période).
  • Y : year (année).
  • M : month (mois).
  • D : day (jour).
  • H : hour (heure).
  • I : minute.
  • S : second (seconde).

Exemple :

$dateInterval = new DateInterval('P1Y2M3D');
echo $dateInterval->format('%y an %m mois %d jours');

Résultat : 1 an 2 mois 3 jours.

Logo

La syntaxe au sein de la méthode "format" est légèrement différente puisqu'elle accepte les minuscules (pour afficher les chiffres sans préfixe "0", ex : "1" au lieu de "1")[9], et aussi :

  • a : nombre de jours au total.
  • N : numéro du jour de la semaine (1 = lundi, 7 = dimanche).

Logo

La syntaxe pour les dates (année, mois, jour) et les temps (heure, minute, seconde) est différente : il faut ajouter un "T" pour les temps. Ex :

 var_dump(new DateInterval('P1D'));  // un jour
 var_dump(new DateInterval('PT1H')); // une heure

Les objets de cette classe peuvent être placés en paramètre des méthodes de DateTime add() et sub(). Ils peuvent aussi être obtenus en résultat de diff() vu ci-dessus.

Pour calculer le nombre de récurrences d'un intervalle au sein d'une période (mais pas la date de fin à partir du début et de la durée)[10].

Cette fonction affiche la date courante au format horodatage Unix, c'est-à-dire en nombre de seconde depuis le premier janvier 1970.

Ce format permet d'additionner ou soustraire deux dates très facilement, est peut être reconverti en date en étant placé en second paramètre de la fonction date().

Cette fonction (make time) crée une chaine de caractères contenant un horodatage Unix, c'est-à-dire un nombre de seconde représentant une date comprise en 1970 et 2038.

Exemple de calcul avec strtotime(), qui accepte les timestamps en second paramètre :

$christmasTimeStamp = mktime(0, 0, 0, 12, 25, 2017); // 1514178000
$FirstDayOfNextMonthTimeStamp = strtotime('first day of next month', $christmasTimeStamp); // 1514782800
echo 'Le premier du mois après Noël 2017 est : '.date('Y-m-d', $FirstDayOfNextMonthTimeStamp); // 2018-01-01

date_default_timezone_set()

[modifier | modifier le wikicode]

Ex :

date_default_timezone_set('Europe/Paris');