Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Дата и время

Дата публикации, срок действия скидки, возраст пользователя — без дат не обходится ни один сайт. В PHP есть простая функция date() и более мощные объекты.

Текущая дата

Функция date() возвращает текущую дату в заданном формате. Буквы в строке формата заменяются частями даты:

<?php
 
$today = date('d.m.Y');
 
echo strlen($today); // 10

Результат зависит от дня запуска — например, 30.01.2025.

Буквы формата

БукваЗначениеПример
dДень с нулём05
mМесяц с нулём01
YГод2025
HЧасы, 24-часовой формат14
iМинуты07
sСекунды30
NДень недели, 1 — понедельник4

Объект даты

Для вычислений удобнее объект DateTimeImmutable. В конструктор передают дату строкой:

<?php
 
$date = new DateTimeImmutable('2025-01-30 14:05');
 
echo $date->format('d.m.Y'), "\n"; // 30.01.2025
echo $date->format('H:i');         // 14:05

Без аргумента объект содержит текущий момент.

Сложение и вычитание

Метод modify() сдвигает дату и возвращает новый объект:

<?php
 
$date = new DateTimeImmutable('2025-01-30');
 
echo $date->modify('+7 days')->format('d.m.Y'), "\n";  // 06.02.2025
echo $date->modify('-1 month')->format('d.m.Y'), "\n"; // 30.12.2024
echo $date->modify('last day of this month')->format('d.m.Y'); // 31.01.2025

Исходный объект не меняется — в этом смысл слова Immutable.

Разница между датами

Метод diff() возвращает промежуток между двумя датами:

<?php
 
$start = new DateTimeImmutable('2025-01-01');
$finish = new DateTimeImmutable('2025-03-01');
 
$interval = $start->diff($finish);
 
echo $interval->days, "\n"; // 59
echo $interval->m;          // 2

Свойство days — полное число дней, m и d — месяцы и дни по отдельности.

Сравнение

Объекты дат сравнивают обычными операторами:

<?php
 
$deadline = new DateTimeImmutable('2025-06-01');
$now = new DateTimeImmutable('2025-05-20');
 
echo $now < $deadline ? 'Ещё есть время' : 'Срок прошёл';

Дата из строки пользователя

createFromFormat() разбирает дату в известном формате и возвращает false, если строка не подошла:

<?php
 
$date = DateTimeImmutable::createFromFormat('d.m.Y', '30.01.2025');
 
echo $date ? $date->format('Y-m-d') : 'Неверная дата'; // 2025-01-30

Частая ошибка

У PHP есть ещё класс DateTime, и его методы меняют сам объект. Переменная, которую вы считали «началом», незаметно изменится:

<?php
 
$start = new DateTime('2025-01-30');
$finish = $start->modify('+1 day');
 
echo $start->format('d.m.Y'); // 31.01.2025 — изменилось и начало

Используйте DateTimeImmutable — с ним таких сюрпризов нет.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.