Как преобразовать дату в timestamp в PHP: способы и примеры
Преобразование строки с датой и временем в числовую метку (timestamp) является одной из частых операций в PHP. Timestamp представляет количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC. В зависимости от источника данных (формат строки, наличие временной зоны, требования к точности) используются разные подходы. Рассмотрим наиболее эффективное решение, а также альтернативные варианты с примерами кода и разбором типичных ошибок.
Основные способы преобразования даты в timestamp
Как надёжно преобразовать строку даты произвольного формата в timestamp с контролем ошибок?
Рекомендуемый способ - использование класса DateTime и метода createFromFormat(). Он позволяет явно указать формат входной строки, что исключает неоднозначности, свойственные функции strtotime().
// Пример: строка '2025-03-15 14:30:00'
$dateString = '2025-03-15 14:30:00';
$dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
if ($dateTime) {
$timestamp = $dateTime->getTimestamp();
echo $timestamp; // 1742045400
} else {
echo 'Ошибка: неверный формат даты';
}
Php дата в timestamp (преобразование даты в timestamp в php)
Метод возвращает объект DateTime или false при неудаче. Получить timestamp можно через getTimestamp() или format('U').
Типичные ошибки:
- Несовпадение разделителей: в шаблоне '.' а в строке '-' - результат
false. - Неучтённая временная зона: по умолчанию используется зона PHP (
date_default_timezone_get()), что может дать неожиданный timestamp. Рекомендуется явно задать зону третьим аргументомcreateFromFormatили черезsetTimezone(). - Пустая строка или
null- возвращаетсяfalse.
Цель использования: преобразование строк, пришедших из внешних источников (API, базы данных, файлы) с фиксированным форматом. Подходит для любого формата, который можно описать маской.
Как преобразовать дату в timestamp с помощью функции strtotime()?
Функция strtotime() принимает английскую текстовую дату и возвращает timestamp. Она удобна для распространённых форматов и относительных выражений.
$timestamp = strtotime('2025-03-15 14:30:00');
echo $timestamp; // 1742045400
// Относительные даты:
echo strtotime('next Monday');
echo strtotime('+1 day');
функция дата php (функция date() в php)
Проблемы:
- Зависимость от локали сервера - русские названия месяцев не распознаются.
- Неоднозначность: '02/03/2025' может быть 2 марта или 3 февраля.
- Возвращает
falseпри ошибке, но не выбрасывает исключение.
Когда использовать: для быстрых преобразований, когда формат даты стандартный (ISO 8601, US-стиль) или нужны относительные строки. Не подходит для строк из пользовательского ввода.
Как собрать timestamp из отдельных компонентов (год, месяц, день, час, минута, секунда)?
Функция mktime() создаёт timestamp на основе переданных чисел.
$timestamp = mktime(14, 30, 0, 3, 15, 2025); // час, мин, сек, месяц, день, год
echo $timestamp; // 1742045400
Php сравнение дат (сравнение дат в php)
Примечание: порядок аргументов неочевидный - час, минута, секунда, месяц, день, год. Ошибочная последовательность приведёт к неверному timestamp.
Ошибки: передача чисел вне допустимых диапазонов (месяц 13) приводит к автоматической коррекции, но без предупреждения. Для строгого контроля лучше использовать checkdate() перед mktime().
Когда использовать: когда дата уже разбита на составляющие (из формы, из базы данных) и нет строки.
Как преобразовать дату из формата MySQL (DATETIME) в timestamp?
MySQL дата 'YYYY-MM-DD HH:MM:SS' отлично парсится strtotime(), но предпочтительнее DateTime::createFromFormat.
$mysqlDate = '2025-03-15 14:30:00';
$ts = DateTime::createFromFormat('Y-m-d H:i:s', $mysqlDate)->getTimestamp();
// или через strtotime
$ts = strtotime($mysqlDate);
прибавить к дате php (прибавление дней к дате в php)
Проблема: если в MySQL используется часовой пояс, отличный от PHP, нужно предварительно конвертировать.
Как преобразовать Unix timestamp обратно в дату?
Хотя вопрос не прямой, но для полноты - обратное преобразование часто требуется вместе с прямым.
$timestamp = 1742045400;
echo date('Y-m-d H:i:s', $timestamp); // 2025-03-15 14:30:00
// или с помощью DateTime
$dt = new DateTime('@' . $timestamp);
echo $dt->format('Y-m-d H:i:s'); // 2025-03-15 14:30:00 (UTC!)
дата php mysql (дата в php и mysql)
Ошибка: date() использует локальный часовой пояс. Для UTC нужно gmdate() или явная установка зоны.
Как обработать дату с микросекундами?
Для дат вида '2025-03-15 14:30:00.123456' DateTime поддерживает микросекунды с форматом 'u'.
$str = '2025-03-15 14:30:00.123456';
$dt = DateTime::createFromFormat('Y-m-d H:i:s.u', $str);
$timestamp = $dt->getTimestamp(); // целое число секунд
$micro = (int)$dt->format('u'); // 123456
Проблема: strtotime() игнорирует микросекунды. Для точности до микросекунд нужен только DateTime.
Расширенные примеры преобразования даты в timestamp
В этом разделе приведены нестандартные ситуации, сложные форматы и работа с временными зонами.
1. Создание timestamp из даты с явной временной зоной
$dateString = '2025-03-15 14:30:00';
$timezone = new DateTimeZone('Europe/Moscow');
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $dateString, $timezone);
$ts = $dt->getTimestamp();
echo $ts; // 1742032200 (разница с UTC +3)
Результат: timestamp соответствует московскому времени. Если зона не указана, используется зона PHP по умолчанию.
2. Обработка даты из формата ISO 8601 с часовым поясом
$isoDate = '2025-03-15T14:30:00+05:00';
$dt = new DateTime($isoDate); // автоматически парсит ISO
echo $dt->getTimestamp(); // 1742033400
Объяснение: new DateTime() умеет распознавать ISO 8601. Timestamp всегда в UTC.
3. Использование date_create_from_format (процедурный стиль)
$date = date_create_from_format('d/m/Y H:i', '15/03/2025 14:30');
if ($date) {
echo date_timestamp_get($date); // 1742045400
}
Функция аналогична DateTime::createFromFormat, но в процедурном стиле.
4. Парсинг даты с названиями месяцев на русском языке
setlocale(LC_TIME, 'ru_RU.UTF-8');
$str = '15 марта 2025 14:30:00';
$format = '%d %B %Y %H:%M:%S';
$ts = strptime($str, $format); // устаревшая функция, только под Linux
if ($ts) {
$timestamp = mktime($ts['tm_hour'], $ts['tm_min'], $ts['tm_sec'],
$ts['tm_mon'] + 1, $ts['tm_mday'], $ts['tm_year'] + 1900);
echo $timestamp; // 1742045400
}
Внимание: strptime устарела и не поддерживается в Windows. Более надёжно - использовать IntlDateFormatter (требует расширение intl).
5. Работа с массивом дат (batch conversion)
$dates = ['2025-03-15', '2025-04-20', 'invalid'];
$timestamps = array_map(function($d) {
$dt = DateTime::createFromFormat('Y-m-d', $d);
return $dt ? $dt->getTimestamp() : null;
}, $dates);
print_r($timestamps);
/* Результат:
Array
(
[0] => 1741996800
[1] => 1745193600
[2] => null
)
*/
Array
(
[0] => 1741996800
[1] => 1745193600
[2] => null
)
Пример демонстрирует обработку ошибок: невалидная дата даёт null.
6. Преобразование даты из пользовательского ввода (формат MM/DD/YYYY)
$input = '03/15/2025';
$format = 'm/d/Y'; // явный формат
$dt = DateTime::createFromFormat($format, $input);
if ($dt) {
echo $dt->getTimestamp(); // 1741996800
} else {
echo 'Неверный формат';
}
Этот способ безопаснее, чем strtotime, который может интерпретировать '/03/15/2025' как 'd/m/Y' в зависимости от локали.
7. Использование getTimestamp с объектами DateTimeImmutable
$immutable = new DateTimeImmutable('2025-03-15');
echo $immutable->getTimestamp(); // 1741996800
DateTimeImmutable не изменяется при модификации, что безопаснее при передаче.
8. Получение timestamp с микросекундами (float)
$str = '2025-03-15 14:30:00.123456';
$dt = DateTime::createFromFormat('Y-m-d H:i:s.u', $str);
$floatTs = $dt->getTimestamp() + (float)$dt->format('u') / 1000000;
echo $floatTs; // 1742045400.123456
Результат: число с плавающей точкой, пригодное для микросекундной точности.