International PHP Conference Berlin 2023

La classe DateInterval

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Introduction

Représente un intervalle de dates.

Un intervalle stocke un nombre fixe de durées (en années, mois, jours, heures, etc.) ou une chaîne relative à une durée dans un format compréhensible par le constructeur de la classe DateTime et DateTimeImmutable.

Plus précisement, l'information d'un objet de la classe DateInterval est une instruction pour aller d'une date/moment à une autre date/moment. Ce processus n'est pas toujours réversible.

Une façon typique de créer un objet DateInterval est en calculant la différence entre deux objets dates/moments à travers DateTimeInterface::diff().

Comme il n'y a pas une manière bien définie pour comparer les intervalles, les instances de DateInterval sont incomparables.

Synopsis de la classe

class DateInterval {
/* Propriétés */
public int $y;
public int $m;
public int $d;
public int $h;
public int $i;
public int $s;
public float $f;
public int $invert;
public mixed $days;
public bool $from_string;
public string $date_string;
/* Méthodes */
public __construct(string $duration)
public static createFromDateString(string $datetime): DateInterval|false
public format(string $format): string
}

Propriétés

Avertissement

Les propriétés disponibles répertoriées ci-dessous dépendent de la version de PHP et doivent être considérées en lecture seule.

y

Année.

m

Nombre de mois.

d

Nombre de jours.

h

Nombre d'heures.

i

Nombre de minutes.

s

Nombre de secondes.

f

Nombre de microsecondes, en une fraction de seconde.

invert

Vaut 1 si l'intervalle représente une période de temps négative, 0 sinon. Voir la méthode DateInterval::format().

days

Si l'objet DateInterval a été créé avec la méthode DateTimeImmutable::diff() ou DateTime::diff(), alors ce sera le nombre total de jours entre la date de début et la date de fin. Sinon, days vaudra false.

from_string

Si l'objet DateInterval a été créé avec la méthode DateInterval::createFromDateString(), alors cette propriété vaudra true, et la propriété date_string sera renseignée. Sinon, cette propriété vaudra false, et les propriétés de y à f, invert, et days seront renseignées.

date_string

La chaîne de caractères utilisée comme argument pour DateInterval::createFromDateString().

Historique

Version Description
8.2.0 Les propriétés from_string et date_string ont été ajoutées aux instances de DateInterval qui ont été créés à l'aide de la méthode DateInterval::createFromDateString().
8.2.0 Seules les propriétés de y jusqu'à f, invert, et days seront visibles.
7.4.0 Les instances de DateInterval sont désormais incomparables ; auparavant, toutes les instances DateInterval était considérées comme égale.
7.1.0 La propriété f a été ajoutée.

Sommaire

add a note

User Contributed Notes 2 notes

up
5
nateb at gurutechnologies dot net
2 years ago
Many people have commented on doing a reverse interval on a date time.  I personally find a backwards year to be a little strange to think about and instead opt to work with just intervals.  This is the easiest I have found.

<?php
$one_year
= new DateInterval('P1Y');
$one_year_ago = new DateTime();
$one_year_ago->sub($one_year);
?>

Instead of:

<?php
$one_year_ago
= new DateInterval( "P1Y" );
$one_year_ago->invert = 1;
$one_year_ago = new DateTime();
$one_year_ago->add($one_year);
?>
up
0
cb
4 days ago
If you want to reverse a date interval use array_reverse and iterator_to_array. I've found using invert to be unreliable.

<?php
$start_date
= date_create("2021-01-01");
$end_date   = date_create("2021-01-05"); // If you want to include this date, add 1 day

$interval = DateInterval::createFromDateString('1 day');
$daterange = new DatePeriod($start_date, $interval ,$end_date);

function
show_dates ($dr) {
    foreach(
$dr as $date1){
        echo
$date1->format('Y-m-d').'<br>';
    }
}

show_dates ($daterange);
  
echo
'<br>';

// reverse the array

$daterange = array_reverse(iterator_to_array($daterange));

show_dates ($daterange);
          
?>

Gives
2021-01-01
2021-01-02
2021-01-03
2021-01-04

2021-01-04
2021-01-03
2021-01-02
2021-01-01
To Top