В PHP существует два основных подхода для работы с датой и временем: объектно-ориентированный (DateTime) и процедурный (timestamp). Рассмотрим оба подхода подробно.
Timestamp — целое число, представляющее количество секунд, прошедших с 1 января 1970 года (Unix Epoch).
// Получение текущего времени
$currentTimestamp = time();
// Преобразование в форматированную строку
echo date('Y-m-d H:i:s', $currentTimestamp);
// Создание timestamp из строки
$timestamp = strtotime('2023-05-15 14:30:00');
// Парсинг даты из строки
$parsedDate = strtotime('next Monday');
Преимущества timestamp:
Недостатки:
DateTime — мощный объектно-ориентированный API для работы с датами.
// Создание объекта с текущей датой
$now = new DateTime();
// Создание с конкретной датой
$date = new DateTime('2023-05-15 14:30:00');
// Форматирование даты
echo $date->format('Y-m-d H:i:s');
// Модификация даты
$date->modify('+1 day');
$date->add(new DateInterval('P1D')); // Добавляет 1 день
// Разница между датами
$diff = $date->diff(new DateTime());
echo $diff->days;
$date = new DateTimeImmutable('2023-05-15');
$newDate = $date->add(new DateInterval('P1D')); // Возвращает новый объект
Преимущества DateTime:
Недостатки:
Критерий | Timestamp | DateTime |
---|---|---|
Читаемость | Низкая | Высокая |
Функциональность | Ограничена | Богатая |
Производительность | Быстрее | Медленнее |
Поддержка TZ | Нет | Да |
Проблема 2038 | Есть | Нет |
Пример с DateTime:
$date = new DateTime('now', new DateTimeZone('Europe/Moscow'));
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s');
С timestamp это сложнее:
date_default_timezone_set('Europe/Moscow');
$timestamp = strtotime('2023-05-15 14:30:00');
Общие форматы:
Y-m-d\TH:i:sP
(2023-05-15T14:30:00+03:00)D, d M Y H:i:s O
(Mon, 15 May 2023 14:30:00 +0300)Y-m-d H:i:s
Для хранения в БД:
Для сложных операций:
Для производительности:
Для временных зон:
Расчет возраста:
$birthday = new DateTime('1990-05-15');
$age = $birthday->diff(new DateTime())->y;
Проверка на выходной:
function isWeekend(DateTimeInterface $date): bool {
return $date->format('N') >= 6;
}
Работа с периодами:
$period = new DatePeriod(
new DateTime('2023-01-01'),
new DateInterval('P1M'),
new DateTime('2023-12-31')
);
foreach ($period as $date) {
echo $date->format('Y-m') . "\n";
}
для современных PHP-приложений предпочтительно использовать объекты DateTime, особенно когда важны читаемость кода, временные зоны и сложные манипуляции с датами. Timestamp может быть полезен для простых операций или когда критична производительность. Всегда учитывайте проблему временных зон и выбирайте подход в зависимости от конкретной задачи.