Класс DateInterval
(PHP 5 >= 5.3.0)
Введение
Представление интервалов дат.
Интервалы дат хранятся либо определенном фиксированном времени (в годах, месяцах, днях, часах и т.д.) или относительной строке времени, формат который поддерживает DateTime конструктор.
Обзор классов
Свойства
- y
-
Количество лет.
- m
-
Количество месяцев.
- d
-
Количество дней.
- h
-
Количество часов.
- i
-
Количество минут.
- s
-
Количество секунд.
- invert
-
Принимает 1, если интервал представляет отрицательный период времени и 0 в противном случае. См. DateInterval::format().
- days
-
Если объект DateInterval создан методом DateTime::diff(), то это суммрное число дней между начальной и конечной датами. В противном случае days примет значение
FALSE
.
Содержание
- DateInterval::__construct — Создает новый объект DateInterval
- DateInterval::createFromDateString — Создает объект класса DateInterval, используя данные из переданной строки
- DateInterval::format — Форматирует интервал
Коментарии
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
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");
?>
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