&reftitle.examples;
Арифметика даты/времени В следующих примерах показываются некоторые подводные камни вычислений даты/времени, относительно переходов на летнее и зимнее время (DST), и месяцев, имеющих разное количество дней. DateTimeImmutable::add/sub добавляет интервалы, охватывающие прошедшее время Добавление PT24H через переход DST приведёт к добавлению 23/25 часов (для большинства часовых поясов). format("Y-m-d H:i:s P"), PHP_EOL; $dt = $dt->add(new DateInterval("PT3H")); echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; ?> ]]> &example.outputs; DateTimeImmutable::modify и strtotime увеличит или уменьшит значения индивидуальных компонентов Добавление +24 часов через переход DST добавит точно 24 часов (вместо учёта перехода на зимнее или летнее время). format("Y-m-d H:i:s P"), PHP_EOL; $dt = $dt->modify("+24 hours"); echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; ?> ]]> &example.outputs; Добавление или вычитание времени может уменьшить или увеличить дату Например, 31 января + 1 месяц вернёт 2 марта (високосный год) или 3 марта (обычный год). format("Y-m-d H:i:s P"), PHP_EOL; $dt = $dt->modify("+1 month"); echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; echo "Високосный год:\n"; // В феврале 29 дней $dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York")); echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; $dt = $dt->modify("+1 month"); echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; ?> ]]> &example.outputs; Для получения последнего дня следующего месяца (то есть чтобы предотвратить переполнение) существует директива last day of. format("Y-m-d H:i:s P"), PHP_EOL; $dt = $dt->modify("last day of next month"); echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; echo "Високосный год:\n"; // Февраль содержит 29 дней $dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York")); echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; $dt = $dt->modify("last day of next month"); echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL; ?> ]]> &example.outputs;