Работа с датами в PHP 7: от основ до продвинутых приёмов

Раздел: Программирование на PHP -> Работа с датами в PHP

Работа с датами в PHP 7

Основной подход – использование объектно-ориентированного класса DateTime (и его неизменяемого аналога DateTimeImmutable). Этот способ даёт максимальную гибкость: форматирование, операции с интервалами, смена часового пояса, сравнение дат.


// Создание даты
$date = new DateTime('2024-03-15 10:30:00');
echo $date->format('Y-m-d H:i:s'); // 2024-03-15 10:30:00

// Форматирование
$formated = $date->format('d.m.Y');
echo $formated; // 15.03.2024

// Добавление интервала
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d'); // 2024-03-25

// Вычитание
$date->sub(new DateInterval('P5D'));
echo $date->format('Y-m-d'); // 2024-03-20

// Сравнение
$date2 = new DateTime('2024-04-01');
if ($date < $date2) {
    echo 'Первая дата раньше';
}

Php date ru (php дата на русском)

Типичные ошибки: забыть, что DateTime изменяем – после добавления интервала исходный объект меняется; неверный формат строки (например, '2024/03/15' без указания разделителя) вызывает исключение. Решение: для проверки использовать DateTime::createFromFormat() или обрабатывать исключения.

Как создать объект даты из строки произвольного формата?


$date = DateTime::createFromFormat('d/m/Y H:i', '15/03/2024 10:30');
if ($date === false) {
    echo 'Неверный формат';
} else {
    echo $date->format('Y-m-d');
}

дата php mysql (дата в php и mysql)

Проблема: при несовпадении формата метод возвращает false, а не бросает исключение. Часто путают порядок символов (например, Y-d-m). Решение: всегда проверять возвращаемое значение через ===.

Как получить разницу между двумя датами?


$date1 = new DateTime('2024-01-01');
$date2 = new DateTime('2024-03-10');
$diff = $date1->diff($date2);
echo $diff->days; // 69
echo $diff->format('%a дней %m месяцев %d дней');

Php 7 дата (даты в php 7)

Ошибка: если необходимо игнорировать время, можно сбросить часы на 00:00:00. Решение: использовать setTime(0,0,0) перед вычислением.

Как изменить дату на определённое количество дней/месяцев?


$date = new DateTime('2024-01-31');
$date->add(new DateInterval('P1M'));
echo $date->format('Y-m-d'); // 2024-03-02 (потому что 31 февраля не существует)

// Лучше использовать модификацию с учётом конца месяца:
$date = new DateTime('2024-01-31');
$date->modify('last day of next month');
echo $date->format('Y-m-d'); // 2024-02-29 (високосный)

Php текущая дата (получение текущей даты в php)

Сложность: add с P1M перескакивает через несуществующий день. Решение: использовать modify('last day of ...') или DateTimeImmutable для цепочки методов.

Как работать с часовыми поясами?


$date = new DateTime('2024-03-15 10:00:00', new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:s T'); // 2024-03-15 10:00:00 MSK

// Перевести в другой пояс
$date->setTimezone(new DateTimeZone('America/New_York'));
echo $date->format('Y-m-d H:i:s T'); // 2024-03-15 02:00:00 EDT (с учётом летнего времени)

Php дата в timestamp (преобразование даты в timestamp в php)

Ошибка: неверное имя таймзоны (например, 'Moskow') вызывает исключение. Решение: проверять через DateTimeZone::listIdentifiers() или использовать валидацию.

Как проверить, является ли строка корректной датой?


function isValidDate(string $date, string $format = 'Y-m-d'): bool {
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) === $date;
}
var_dump(isValidDate('2024-02-30')); // false
var_dump(isValidDate('2024-02-29')); // true (високосный)

Php дата в строку (преобразование даты в строку в php)

Подводный камень: createFromFormat может вернуть объект для даты типа 2024-02-30, но при строгой проверке через format вернёт 2024-03-01. Используйте дополнительную проверку.

Как получить метку времени Unix?


$date = new DateTime('2024-03-15 10:30:00');
echo $date->getTimestamp(); // 1710484200

прибавить к дате php (прибавление дней к дате в php)

Не требуется дополнительных действий, однако метка времени не учитывает часовой пояс (всегда UTC).

Как пройтись по последовательности дат?


$start = new DateTime('2024-01-01');
$end   = new DateTime('2024-01-05');
$interval = new DateInterval('P1D');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format('Y-m-d') . "\n";
}
// Результат:
// 2024-01-01
// 2024-01-02
// 2024-01-03
// 2024-01-04

Php дата между (проверка даты между двумя датами в php)

Нюанс: по умолчанию конечная дата не включается. Чтобы включить, используйте DatePeriod::INCLUDE_END_DATE третьим аргументом: new DatePeriod($start, $interval, $end, DatePeriod::INCLUDE_END_DATE);.

Как работать с неизменяемыми объектами?


$immutable = new DateTimeImmutable('2024-01-01');
$new = $immutable->modify('+10 days');
echo $immutable->format('Y-m-d'); // 2024-01-01 (не изменилась)
echo $new->format('Y-m-d');      // 2024-01-11

Ошибка: разработчики, привыкшие к DateTime, могут не ожидать, что исходный объект не меняется. Решение: всегда присваивать результат модификации новой переменной.

- Php дата год (получение года из даты в php)

Расширенные примеры работы с датами в PHP 7

Вычисление возраста по дате рождения

Пример

$birthday = new DateTime('1990-05-15');
$now      = new DateTime('now');
$age      = $birthday->diff($now);
echo $age->y . ' лет, ' . $age->m . ' месяцев, ' . $age->d . ' дней';
// Пример: 33 года 9 месяцев 20 дней

Список пятниц 13-го в заданном году

Пример

$year = 2024;
$start = new DateTime("$year-01-01");
$end   = new DateTime("$year-12-31");
$interval = new DateInterval('P1D');
$period   = new DatePeriod($start, $interval, $end);

$fridays13 = [];
foreach ($period as $day) {
    if ($day->format('d') == 13 && $day->format('N') == 5) {
        $fridays13[] = $day->format('Y-m-d');
    }
}
echo implode(', ', $fridays13);
// Результат: 2024-09-13, 2024-12-13
2024-09-13, 2024-12-13

Проверка високосного года

Пример

function isLeapYear(int $year): bool {
    $date = DateTime::createFromFormat('Y-m-d', "$year-02-29");
    return $date !== false;
}
var_dump(isLeapYear(2024)); // true
var_dump(isLeapYear(2023)); // false
bool(true)
bool(false)

Итерация по кварталам с получением первого дня

Пример

$year = 2024;
$start = new DateTime("$year-01-01");
$end   = new DateTime("$year-12-31");
$interval = new DateInterval('P3M');
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $quarterStart) {
    echo $quarterStart->format('Y-m-d') . "\n";
}
// Результат:
// 2024-01-01
// 2024-04-01
// 2024-07-01
// 2024-10-01
2024-01-01
2024-04-01
2024-07-01
2024-10-01

Форматирование даты в RFC 2822 (для заголовков e‑mail)

Пример

$date = new DateTime('now');
echo $date->format(DateTime::RFC2822);
// Пример: Sat, 26 Oct 2024 14:30:00 +0300
Sat, 26 Oct 2024 14:30:00 +0300

Сравнение дат с точностью до дня (игнорирование времени)

Пример

$dateA = new DateTime('2024-01-15 23:59:59');
$dateB = new DateTime('2024-01-16 00:00:00');

// Сбросим время
$dateA->setTime(0,0,0);
$dateB->setTime(0,0,0);

if ($dateA == $dateB) {
    echo 'Даты равны (по дням)';
} else {
    echo $dateA < $dateB ? 'A раньше' : 'B раньше';
}
// Результат: Даты равны (по дням)
Даты равны (по дням)

Обработка исключений при создании даты из произвольной строки

Пример

try {
    $date = new DateTime('некорректная строка');
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
// Вывод: PHP Error: DateTime::__construct(): Failed to parse time string (некорректная строка) at position 0 (н): The timezone could not be found in the database

// Более надёжный вариант с createFromFormat и проверкой:
if (($date = DateTime::createFromFormat('Y-m-d', '2024-02-30')) === false) {
    echo 'Дата не существует';
}
Дата не существует

Даты в PHP 7 - comments

En
Php 7 дата (php)