Date parse: примеры (PHP)

Использование функции date_parse для анализа даты и времени
Раздел: Дата и время
date_parse(string $datetime): array

Описание функции date_parse

Функция date_parse() в PHP используется для разбора строки с датой и временем. Она возвращает ассоциативный массив с подробной информацией о всех компонентах даты.

Когда применяется

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

Аргументы функции

Функция принимает один обязательный аргумент:
string $datetime - Строка, содержащая дату и время для анализа. Может быть в различных форматах, распознаваемых функцией.

Возвращает массив с ключами, такими как year, month, day, hour, minute, second, fraction, warning_count, warnings, error_count, errors, is_localtime, zone_type, zone, is_dst.

Примеры использования

Разбор стандартной даты
<?php
print_r(date_parse("2023-12-31 14:30:45.123456"));
?>
Array
(
    [year] => 2023
    [month] => 12
    [day] => 31
    [hour] => 14
    [minute] => 30
    [second] => 45
    [fraction] => 0.123456
    [warning_count] => 0
    [warnings] => Array
        ()
    [error_count] => 0
    [errors] => Array
        ()
    [is_localtime] =>
    [zone_type] => 3
    [zone] => 0
    [is_dst] =>
)
Разбор строки с ошибками
<?php
print_r(date_parse("2023-02-31 25:70:80"));
?>
Array
(
    [year] => 2023
    [month] => 2
    [day] => 31
    [hour] => 25
    [minute] => 70
    [second] => 80
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        ()
    [error_count] => 3
    [errors] => Array
        (
            [11] => The parsed date was invalid
            [15] => The parsed time was invalid
            [19] => The parsed time was invalid
        )
    [is_localtime] =>
    [zone_type] => 3
    [zone] => 0
    [is_dst] =>
)

Похожие функции PHP

strtotime()

Функция strtotime() преобразует текстовое представление даты на английском языке в метку времени Unix. Более проста, но менее детальна, чем date_parse(). Используется для простого преобразования строки в timestamp.

DateTime::createFromFormat()

Статический метод класса DateTime. Позволяет создавать объект DateTime из строки с заданным форматом. Используется, когда формат даты заранее известен. Позволяет осуществлять более строгий парсинг.

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

Альтернативы в других языках

Python: dateutil.parser.parse()
from dateutil import parser
result = parser.parse("2023-12-31 14:30:45.123456")
print(result)  # 2023-12-31 14:30:45.123456
print(result.year)  # 2023
2023-12-31 14:30:45.123456
2023

Модуль dateutil предлагает более гибкий парсер. Стандартный datetime.strptime() требует строгого формата.

JavaScript: Date.parse()
let timestamp = Date.parse("2023-12-31T14:30:45.123Z");
console.log(timestamp); // 1704033045123
console.log(new Date(timestamp).getFullYear()); // 2023
1704033045123
2023

Возвращает количество миллисекунд, а не детализированный объект. Для разбора в компоненты нужно создавать объект Date.

MySQL: STR_TO_DATE()
SELECT STR_TO_DATE('31,12,2023', '%d,%m,%Y');
2023-12-31

Преобразует строку в значение типа DATETIME, DATE или TIME согласно указанному формату. Работает на стороне СУБД.

Типичные ошибки

Ожидание создания timestamp

date_parse() не возвращает метку времени Unix. Она возвращает массив с деталями.

<?php
$result = date_parse("now");
$timestamp = $result['timestamp']; // ОШИБКА! Такого ключа нет.
?>
PHP Notice:  Undefined index: timestamp
Некорректная локализация

Функция не учитывает локаль пользователя для названий месяцев или дней недели.

<?php
setlocale(LC_TIME, 'ru_RU.UTF-8');
print_r(date_parse("31 декабря 2023"));
?>
Array
(
    [year] =>
    [month] =>
    [day] =>
    ... // Поля пустые, ошибки
)
Игнорирование високосного года в ошибках

Функция может принять 29 февраля для невисокосного года, но отметит это в массиве ошибок, а не в предупреждениях.

<?php
$r = date_parse("2023-02-29");
echo "Ошибок: " . $r['error_count'];
?>
Ошибок: 1

Изменения в последних версиях PHP

В PHP 8.0 поведение функции date_parse() было уточнено, но без критических изменений в её работе. Основные изменения в экосистеме работы с датами связаны с появлением класса DateTimeImmutable и улучшениями в расширении Intl. Сама date_parse() остаётся стабильной функцией.

Расширенные примеры

Работа с относительными форматами
Пример php
<?php
$result = date_parse("next Monday +2 hours");
print_r($result['hour']);
?>
2 // Возвращает час из разбора относительного формата, но не вычисляет итоговую дату.
Анализ временных зон
Пример php
<?php
$result = date_parse("2023-12-31T14:30:45+05:00");
print_r([
    'is_localtime' => $result['is_localtime'],
    'zone_type' => $result['zone_type'],
    'zone' => $result['zone']
]);
?>
Array
(
    [is_localtime] => 1
    [zone_type] => 1
    [zone] => 18000
)

zone_type = 1 указывает на смещение UTC в секундах (5 часов = 18000 секунд).

Сборка даты из результата
Пример php
<?php
$parsed = date_parse("2024-01-15");
if ($parsed['error_count'] == 0 && checkdate($parsed['month'], $parsed['day'], $parsed['year'])) {
    $date = sprintf('%04d-%02d-%02d', $parsed['year'], $parsed['month'], $parsed['day']);
    echo $date;
}
?>
2024-01-15
Разбор даты с микросекундами
Пример php
<?php
$result = date_parse("14:30:45.987654");
echo $result['fraction'];
?>
0.987654

PHP date_parse function comments

En
Date parse Returns associative array with detailed info about given date