Date parse: примеры (PHP)
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() преобразует текстовое представление даты на английском языке в метку времени Unix. Более проста, но менее детальна, чем date_parse(). Используется для простого преобразования строки в timestamp.
Статический метод класса DateTime. Позволяет создавать объект DateTime из строки с заданным форматом. Используется, когда формат даты заранее известен. Позволяет осуществлять более строгий парсинг.
Функция проверяет корректность даты по отдельным числовым значениям (год, месяц, день). Удобна для валидации после получения отдельных компонентов, например, от date_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) # 20232023-12-31 14:30:45.123456 2023
Модуль dateutil предлагает более гибкий парсер. Стандартный datetime.strptime() требует строгого формата.
let timestamp = Date.parse("2023-12-31T14:30:45.123Z");
console.log(timestamp); // 1704033045123
console.log(new Date(timestamp).getFullYear()); // 20231704033045123 2023
Возвращает количество миллисекунд, а не детализированный объект. Для разбора в компоненты нужно создавать объект Date.
SELECT STR_TO_DATE('31,12,2023', '%d,%m,%Y');2023-12-31
Преобразует строку в значение типа DATETIME, DATE или TIME согласно указанному формату. Работает на стороне СУБД.
Типичные ошибки
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
$result = date_parse("next Monday +2 hours");
print_r($result['hour']);
?>2 // Возвращает час из разбора относительного формата, но не вычисляет итоговую дату.
<?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
$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
$result = date_parse("14:30:45.987654");
echo $result['fraction'];
?>0.987654