Как преобразовать дату в timestamp в PHP: способы и примеры

Раздел: Программирование на PHP -> Работа с датами в 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.

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

Расширенные примеры преобразования даты в 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

Результат: число с плавающей точкой, пригодное для микросекундной точности.

Преобразование даты в timestamp в PHP - comments

En
Php дата в timestamp (php)