A classe DateInterval

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

Introdução

Representa um intervalo entre datas.

Um intervalo de data armazena, tanto uma quantidade de tempo (em anos, meses, dias, horas, etc), quanto uma string de tempo relativo no formato que os construtores das classes DateTimeImmutable e DateTime suportam.

Mais especificamente, a informação em um objeto da classe DateInterval é uma instrução para mover de uma data/hora para outra data/hora. Este processo nem sempre é reversível.

Uma maneira comum de criar um objeto DateInterval é calculando a diferença entre dois objetos data/hora através do método DateTimeInterface::diff().

Como não existe uma maneira bem definida de comparar intervalos de datas, as instâncias de DateInterval são incomparáveis.

Resumo da classe

class DateInterval {
/* Propriedades */
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;
/* Métodos */
public __construct(string $duration)
public static createFromDateString(string $datetime): DateInterval|false
public format(string $format): string
}

Propriedades

Aviso

As propriedades disponíveis listadas abaixo dependem da versão do PHP, e devem ser consideradas como somente-leitura.

y

Número de anos.

m

Número de meses.

d

Número de dias.

h

Número de horas.

i

Número de minutos.

s

Número de segundos.

f

Número de microssegundos, como uma fração de um segundo.

invert

Será 1 se o intervalo representa um período negativo de tempo e 0 caso contrário. Veja DateInterval::format().

days

Se o objeto DateInterval foi criado por DateTimeImmutable::diff() ou DateTime::diff(), então ele representará o número total de dias inteiros entre a data inicial e final. Caso contrário, days será false.

from_string

Se o objeto DateInterval foi criado por DateInterval::createFromDateString(), então o valor desta propriedade será true e a propriedade date_string será populada. Caso contrário, o valor será false e as propriedades y a f, invert e days serão populadas.

date_string

String usado como argumento para DateInterval::createFromDateString().

Registro de Alterações

Versão Descrição
8.2.0 As propriedades from_string e date_string foram adicionadas para instâncias DateInterval que foram criadas usando o método DateInterval::createFromDateString().
8.2.0 Apenas as propriedades y a f, invert, e days serão visíveis.
7.4.0 As instâncias de DateInterval agora são incomparáveis; antes, todas as instâncias de DateInterval eram consideradas iguais.
7.1.0 A propriedade f foi adicionada.

Índice

add a note

User Contributed Notes 4 notes

up
40
cb
1 year 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
up
5
julio dot necronomicon at gmail dot com
8 months ago
More simple example i use to add or subtract.

<?php
$Datetime
= new Datetime('NOW', new DateTimeZone('America/Bahia'));
$Datetime->add(DateInterval::createFromDateString('2 day'));

echo
$Datetime->format("Y-m-d H:i:s");
?>
up
0
edgaras at levinson dot lt
2 months ago
There is a handy way to compare intervals by adding them to 0 dates and comparing dates instead

<?php

function compare(DateInterval $first, DateInterval $second): int
{
$firstDate = (new DateTime())->setTimestamp(0)->add($first);
$secondDate = (new DateTime())->setTimestamp(0)->add($second);

return
$firstDate <=> $secondDate;
}

echo
compare(new DateInterval('P2D'), new DateInterval('PT48H')) . PHP_EOL;
echo
compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('48 hours')) . PHP_EOL;
echo
compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('49 hours')) . PHP_EOL;
echo
compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('47 hours')) . PHP_EOL;

?>

Outputs:
0
0
-1
1
up
-5
nateb at gurutechnologies dot net
4 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);
?>
To Top