Дата и время в PHP и MySQL: основные подходы и практические советы

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

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

При создании веб-приложений разработчики часто сталкиваются с необходимостью обработки дат и времени. PHP и MySQL предлагают развитые средства для этих задач. Ниже рассматриваются различные подходы, начиная с самого надёжного.

Основное решение: класс DateTimeImmutable и параметризованные запросы

Наиболее надёжным способом работы с датами в PHP является использование неизменяемого класса DateTimeImmutable. Он исключает случайное изменение объектов и упрощает отладку. В MySQL следует использовать тип данных DATE, DATETIME или TIMESTAMP и передавать значения через подготовленные выражения.

Пример: сохранение даты регистрации пользователя и её форматированный вывод.


// Сохранение в базу
$date = new DateTimeImmutable('2025-04-10 12:00:00', new DateTimeZone('UTC'));
$pdo->prepare('INSERT INTO users (name, registered_at) VALUES (?, ?)')
    ->execute([$name, $date->format('Y-m-d H:i:s')]);

// Получение и форматирование
$stmt = $pdo->query('SELECT registered_at FROM users WHERE id = 1');
$row = $stmt->fetch();
$stored = new DateTimeImmutable($row['registered_at']);
echo $stored->format('d.m.Y H:i'); // 10.04.2025 12:00

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

Типичная ошибка: использование date() с меткой времени, полученной из MySQL без учёта часового пояса. Это приводит к смещению времени. Решение: всегда указывать временную зону в PHP (date_default_timezone_set) или использовать DateTimeImmutable.

Как получить отформатированную дату из Unix timestamp?

Для простых задач, когда не требуется учёт временных зон, можно использовать функции date() и strtotime().


$timestamp = 1649500000;
echo date('Y-m-d H:i:s', $timestamp);

функция дата php (функция date() в php)

Ошибка: strtotime() может вернуть false для некорректной строки. Следует проверять результат.

Как прибавить 1 месяц к дате, учитывая переход на летнее время?

Класс DateTime (мутабельный) позволяет добавлять интервалы с учётом временных зон.


$date = new DateTime('2025-03-31', new DateTimeZone('Europe/Moscow'));
$date->add(new DateInterval('P1M'));
echo $date->format('Y-m-d'); // 2025-04-30 (автокоррекция)

Php сравнение дат (сравнение дат в php)

Проблема: при добавлении 1 месяца к 31 января получится 2 марта (в невисокосный год). Используйте modify('last day of next month') для точности.

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

Библиотека Carbon (часть Laravel) предоставляет выразительные методы.


use Carbon\Carbon;
$start = Carbon::parse('2025-01-01');
$end = Carbon::parse('2025-04-10');
echo $start->diffInDays($end); // 99

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

Без Carbon: использовать DateTime::diff(), который возвращает DateInterval.

Как выбрать записи за последние 7 дней в MySQL?

В запросах можно использовать функции MySQL: NOW(), DATE_SUB().


SELECT * FROM orders 
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

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

Ошибка: если created_at содержит время, сравнение по дате может быть неточным. Используйте DATE(created_at) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) для сравнения только по дате.

Как корректно отображать время для пользователей в разных часовых поясах?

Для корректного отображения даты следует хранить в UTC и конвертировать в нужный часовой пояс на стороне PHP.


$utc = new DateTimeImmutable('2025-04-10 12:00:00', new DateTimeZone('UTC'));
$userTz = new DateTimeZone('America/New_York');
$local = $utc->setTimezone($userTz);
echo $local->format('Y-m-d H:i:s'); // 2025-04-10 08:00:00

Распространённая ошибка: хранение дат с часовым поясом в формате TIMESTAMP в MySQL - сервер преобразует их в своё время. Лучше использовать DATETIME и хранить UTC.

- Php дата между (проверка даты между двумя датами в php)
- Php 7 дата (даты в php 7)
- Php дата год (получение года из даты в php)

Дополнительные примеры работы с датами

Вычисление возраста

Пример

$birth = new DateTimeImmutable('1990-05-15');
$now = new DateTimeImmutable('now');
$age = $now->diff($birth)->y;
echo "Возраст: $age";
Возраст: 34 (на 2025 год)

Группировка записей по месяцам в MySQL

Пример

SELECT DATE_FORMAT(created_at, '%Y-%m') AS month, COUNT(*) AS cnt
FROM orders
GROUP BY month
ORDER BY month;
month      cnt
2025-01    120
2025-02    95
2025-03    150

Генерация списка дней между двумя датами с DatePeriod

Пример

$start = new DateTime('2025-04-01');
$end = new DateTime('2025-04-10');
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
    echo $date->format('Y-m-d') . "\n";
}
2025-04-01
2025-04-02
...
2025-04-09

Валидация пользовательского ввода даты

Пример

$input = '2025-13-01'; // неверный месяц
$format = 'Y-m-d';
$date = DateTime::createFromFormat($format, $input);
if (!$date || $date->format($format) !== $input) {
    echo "Некорректная дата";
} else {
    echo "Дата корректна";
}
Некорректная дата

Обработка повторяющихся событий: каждый вторник

Пример

$start = new DateTime('2025-04-01');
$end = new DateTime('2025-05-01');
$interval = new DateInterval('P1W');
$period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);
foreach ($period as $date) {
    if ($date->format('N') == 2) {
        echo $date->format('Y-m-d') . "\n";
    }
}
2025-04-08
2025-04-15
2025-04-22
2025-04-29

Дата в PHP и MySQL - comments

En
дата php mysql (php)