Date et heure

Nette propose deux classes pour travailler avec la date et l'heure : Nette\Utils\DateTimeImmutable (immuable, recommandée) et Nette\Utils\DateTime (muable). Toutes deux étendent les classes natives de PHP, si bien que chaque méthode native reste disponible, et y ajoutent les deux mêmes améliorations.

Premièrement, elles sont strictes. Là où PHP accepte silencieusement des dates invalides comme 0000-00-00 (converti en -0001-11-30) ou 2024-02-31 (converti en 2024-03-02), ces classes lèvent une exception.

Deuxièmement, elles corrigent le comportement lors des passages à l'heure d'été (DST), où l'ajout d'un temps relatif en PHP natif (par ex. +100 minutes) peut aboutir à une heure antérieure à l'ajout d'une durée plus courte (par ex. +50 minutes). Ces classes garantissent que l'arithmétique fonctionne de façon intuitive et que +100 minutes donne toujours plus que +50 minutes.

Installation :

composer require nette/utils

Immuable ou muable ?

La classe DateTimeImmutable est disponible depuis la version 4.1.5 et constitue le choix recommandé. Chaque méthode modificatrice retourne une nouvelle instance au lieu de changer l'originale : un objet que vous avez stocké ou passé à une fonction ne peut donc jamais changer à votre insu :

use Nette\Utils\DateTimeImmutable;

$date = new DateTimeImmutable('2024-02-26');
$next = $date->modify('+1 day');
echo $date; // 2024-02-26 00:00:00  (inchangé)
echo $next; // 2024-02-27 00:00:00  (un nouvel objet)

DateTime est muable : le même appel modifie l'objet sur place. Elle n'est pas dépréciée, mais pour du code neuf, la variante immuable est préférable.

use Nette\Utils\DateTime;

$date = new DateTime('2024-02-26');
$date->modify('+1 day');
echo $date; // 2024-02-27 00:00:00  (l'original a changé)

Comme les deux classes étendent les classes natives, vous continuez d'employer les méthodes que vous connaissez déjà : format(), getTimestamp(), add(), sub(), diff(), setTimezone(), les opérateurs de comparaison, etc. Sur DateTimeImmutable, toutes les méthodes modificatrices retournent une nouvelle instance. La suite de cette page décrit uniquement ce que Nette ajoute par-dessus ; sauf mention contraire, tout fonctionne de la même façon dans les deux classes.

Création des objets

static from (string|int|\DateTimeInterface|null $time)static

Crée un objet à partir d'une chaîne, d'un timestamp UNIX ou d'un autre objet DateTimeInterface. null signifie l'heure actuelle. Lève une exception si la date et l'heure ne sont pas valides.

DateTimeImmutable::from(1_138_013_640); // depuis un timestamp UNIX, avec le fuseau horaire par défaut
DateTimeImmutable::from('1994-02-26 04:15:32'); // depuis une chaîne
DateTimeImmutable::from('1994-02-26'); // depuis une date, l'heure sera 00:00:00
DateTimeImmutable::from(null); // la date et l'heure actuelles

static fromParts (int $year, int $month, int $day, int $hour=0, int $minute=0, float $second=0.0)static

Crée un objet à partir de composants individuels, ou lève une exception si la date et l'heure ne sont pas valides.

DateTimeImmutable::fromParts(1994, 2, 26, 4, 15, 32);

static createFromFormat (string $format, string $datetime, string|\DateTimeZone|null $timezone=null): static|false

Étend la méthode native DateTime::createFromFormat avec la possibilité d'indiquer le fuseau horaire sous forme de chaîne.

DateTimeImmutable::createFromFormat('d.m.Y', '26.02.1994', 'Europe/London');

Validation stricte

Une date ou une heure invalide n'est jamais corrigée en silence : elle lève toujours une exception. Cela vaut pour toutes les façons de créer ou de modifier un objet : le constructeur, from(), fromParts() et les méthodes setDate() et setTime().

new DateTimeImmutable('2024-02-31');         // lève une exception (février n'a pas de 31)
DateTimeImmutable::fromParts(2024, 2, 31);   // lève une exception
$date->setDate(2024, 2, 31);                 // lève une exception
$date->setTime(25, 0);                       // lève une exception (il n'y a pas de 25e heure)

Sortie texte et JSON

__toString() retourne la date et l'heure au format Y-m-d H:i:s : un objet peut donc être affiché ou concaténé directement :

echo $date; // '2017-02-03 04:15:32'

Les deux classes implémentent JsonSerializable et se sérialisent au format ISO 8601, couramment utilisé en JavaScript :

echo json_encode($date); // '"2017-02-03T04:15:32+01:00"'

Fonctionnalités supplémentaires de DateTime

La classe muable DateTime porte quelques membres supplémentaires qui n'ont de sens que pour un objet muable et qui ne font donc pas partie de DateTimeImmutable.

Sa méthode from() traite en outre un petit nombre comme un décalage en secondes par rapport à l'heure actuelle. La variante immuable omet volontairement ce raccourci : un nombre y est toujours un timestamp littéral.

DateTime::from(42); // l'heure actuelle plus 42 secondes

modifyClone(string $modify=''): static retourne une copie modifiée et laisse l'original intact. Sur un objet muable, elle offre ce que modify() donne gratuitement sur l'objet immuable :

$original = DateTime::from('2017-02-03');
$clone = $original->modifyClone('+1 day');
$original->format('Y-m-d'); // '2017-02-03'  (inchangé)
$clone->format('Y-m-d');    // '2017-02-04'

DateTime::relativeToSeconds(string $relativeTime): int convertit une chaîne de temps relatif en secondes :

DateTime::relativeToSeconds('1 minute'); // 60
DateTime::relativeToSeconds('-1 hour'); // -3600

Enfin, DateTime définit les constantes MINUTE, HOUR, DAY, WEEK, MONTH et YEAR, qui expriment une durée en secondes ; MONTH et YEAR sont des moyennes, ne vous en servez donc que pour des estimations approximatives.

version: 4.x