Способы получения и форматирования даты в PHP

Раздел: Основы PHP -> Получение информации в PHP

В PHP существует несколько способов работы с датами и временем. Выбор метода зависит от задачи: просто получить строку, работать с временными метками, выполнять вычисления или учитывать временные зоны. Ниже рассматриваются основные подходы.

Основные методы получения даты

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

<?php
echo date('Y-m-d H:i:s'); // 2025-04-08 14:30:00
?>

узнать дату php (узнать дату в php)

Это самый распространённый способ. Функция date() принимает строку формата и необязательную метку времени (если не указана, используется текущая). Формат Y-m-d H:i:s соответствует ISO 8601. Поддерживаются десятки символов форматирования: d (день), m (месяц), Y (год), H (часы) и другие.

Возможные проблемы: часовой пояс по умолчанию может не совпадать с нужным. Перед вызовом date() рекомендуется установить временную зону через date_default_timezone_set('Europe/Moscow'). Ошибка: Warning: date(): It is not safe to rely on the system's timezone settings - означает отсутствие заданной зоны.

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

<?php
echo time(); // 1744103400
?>

time() возвращает количество секунд с 1 января 1970 года (Unix timestamp). Это основа для многих вычислений. Метку можно передать в date('Y-m-d', $timestamp) для форматирования.

Ошибки связаны с переполнением в 2038 году на 32-битных системах (Y2K38). На 64-битных системах проблема неактуальна.

Как работать с датами объектно-ориентированно?

<?php
$dt = new DateTime();
echo $dt->format('Y-m-d H:i:s'); // 2025-04-08 14:30:00
?>

Класс DateTime позволяет не только получать, но и изменять дату, сравнивать, вычитать интервалы. По умолчанию используется временная зона из конфигурации. Для смены зоны передаётся второй аргумент: new DateTime('now', new DateTimeZone('UTC')).

Mutability: методы modify(), add() изменяют исходный объект. Чтобы избежать случайных изменений, используют DateTimeImmutable.

Как преобразовать текстовое описание даты в метку?

<?php
echo strtotime('next Monday'); // зависит от текущей даты
echo strtotime('2025-12-31');
?>

strtotime() понимает множество английских фраз: 'now', '+1 day', 'last week', 'first day of next month'. Возвращает Unix-метку.

Не все строки корректно разбираются. Например, 'next Monday' в воскресенье может дать следующий понедельник (через день). Рекомендуется проверять результат: if (strtotime(...) === false).

Как получить компоненты даты в виде массива?

<?php
$arr = getdate();
print_r($arr);
/*
Array
(
    [seconds] => 30
    [minutes] => 30
    [hours] => 14
    [mday] => 8
    [wday] => 2
    [mon] => 4
    [year] => 2025
    [yday] => 97
    [weekday] => Tuesday
    [month] => April
    [0] => 1744103400
)
*/
?>

getdate() без аргументов возвращает массив с полями: день недели, месяц (текст), день года и т.д. Удобно для вывода на русском языке (массив можно заменить своими названиями).

Поле wday (день недели) начинается с 0 (воскресенье), что может вызвать путаницу. Перед использованием рекомендуется проверить документацию.

Как создать метку из отдельных компонентов (год, месяц, день)?

<?php
echo mktime(14, 30, 0, 4, 8, 2025); // 1744103400
?>

mktime() принимает часы, минуты, секунды, месяц, день, год. Возвращает Unix-метку. Полезна для конструирования даты из пользовательского ввода.

Если передать неверные значения (например, месяц 13), PHP автоматически скорректирует дату (станет январь следующего года). Это может быть неожиданным. Для проверки корректности используется checkdate().

Как проверить, существует ли дата (например, 29 февраля 2023)?

<?php
var_dump(checkdate(2, 29, 2023)); // bool(false)
var_dump(checkdate(2, 29, 2024)); // bool(true)
?>

checkdate() принимает месяц, день, год и возвращает true, если дата корректна (високосные годы учтены).

Функция не проверяет диапазон года (он может быть отрицательным или слишком большим), но для обычных задач этого достаточно.

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

<?php
$micro = microtime(true);
echo $micro; // 1744103400.123456
?>

microtime(true) возвращает float с секундами и микросекундами. Полезно для измерения времени выполнения скрипта.

Точность может варьироваться в зависимости от системы. Не следует полагаться на микросекунды для критичных операций синхронизации.

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

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

Пример
<?php
$birthday = new DateTime('1990-06-15');
$now = new DateTime('now');
$diff = $now->diff($birthday);
echo $diff->y; // 34 (годы)
echo $diff->days; // количество дней
?>

Метод diff() возвращает объект DateInterval со свойствами y, m, d. Возраст вычисляется корректно с учётом високосных годов.

Количество дней между двумя датами

Пример
<?php
$date1 = date_create('2025-01-01');
$date2 = date_create('2025-12-31');
$interval = date_diff($date1, $date2);
echo $interval->days; // 364
?>

Функция date_diff() (псевдоним DateTime::diff) возвращает количество полных дней.

Форматирование с учётом локали

Пример
<?php
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::NONE);
echo $fmt->format(new DateTime('2025-04-08')); // 8 апреля 2025 г.
?>

Расширение intl необходимо установить. Форматтер поддерживает все локали и позволяет выводить месяцы и дни недели на нужном языке.

Итерация по дням с помощью DatePeriod

Пример
<?php
$start = new DateTime('2025-04-01');
$end = (new DateTime('2025-04-10'))->modify('+1 day');
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
    echo $date->format('Y-m-d') . ' ';
}
// 2025-04-01 2025-04-02 ... 2025-04-10
?>

DatePeriod исключает конечную дату, поэтому к ней добавляется один день.

Измерение времени выполнения скрипта

Пример
<?php
$start = microtime(true);
// код
usleep(500000);
$end = microtime(true);
echo ($end - $start) . ' сек.'; // 0.500...
?>

Использование microtime(true) до и после участка кода даёт точное время в секундах с микросекундами.

Создание даты из строки с нестандартным форматом

Пример
<?php
$date = DateTime::createFromFormat('d/m/Y H:i', '08/04/2025 14:30');
echo $date->format('Y-m-d'); // 2025-04-08
?>

createFromFormat() позволяет задать свой формат ввода. Это удобно при импорте данных из внешних источников.

Работа с временными зонами

Пример
<?php
$tz = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $tz);
echo $dt->format('Y-m-d H:i:s T'); // 2025-04-08 06:30:00 EDT
?>

Список поддерживаемых зон: DateTimeZone::listIdentifiers().

Узнать дату в PHP - comments

En
узнать дату php (php)