(PHP 5 >= 5.3.0, PHP 7, PHP 8)
date_parse_from_format — Разбирает строку с датой по заданному формату
Функция возвращает ассоциативный массив с подробной информацией о дате и времени.
format
Описание параметра format приводится
в документации к методу DateTimeImmutable::createFromFormat() .
Для параметра функции действуют аналогичные правила.
datetimeСтроковое представление даты и времени.
Функция возвращает ассоциативный массив с подробной информацией о дате и времени.
Результирующий массив содержит следующие ключи: year,
month, day, hour,
minute, second,
fraction и is_localtime.
Элемент zone_type укажет тип часового пояса, если массив с результатами содержит элемент is_localtime.
Для 1-го типа представления часовых поясов — со смещением относительно времени UTC — добавляются поля zone и is_dst;
для 2-го типа представления — аббревиатура — добавляются поля tz_abbr и is_dst;
для 3-го тип — идентификатор часового пояса — добавляются поля tz_abbr и tz_id.
Массив включает поля warning_count и warnings.
Первое указывает количество предупреждений.
Ключи элементов массива warnings указывают позицию в аргументе datetime,
на которой возникло предупреждение, а строковое значение содержит описание предупреждения.
Массив также содержит поля error_count и errors.
Первое указывает количество ошибок.
Ключи элементов массива errors указывают позицию в аргументе datetime,
на которой возникла ошибка, а строковое значение содержит описание ошибки.
Функция запишет в массивы warnings
и errors меньшее количество элементов,
чем указывают значения элементов warning_count и error_count,
если предупреждения или ошибки возникнут на тех же позициях.
Функция выбрасывает ошибку ValueError ,
если параметр datetime содержит нулевые байты.
| Версия | Описание |
|---|---|
| 8.0.21, 8.1.8, 8.2.0 |
При передаче нулевых байтов в параметр datetime
функция теперь выбрасывает ошибку ValueError ;
раньше функция молча игнорировала нулевые байты.
|
| 7.2.0 |
Элемент zone в массиве результатов теперь содержит
секунды вместо минут, а знак инвертируется, например:
значение -120 теперь выводится как 7200.
|
Пример #1 Пример разбора строки с датой и временем по заданному формату функцией date_parse_from_format()
<?php
$date = "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));Результат выполнения приведённого примера:
Array ( [year] => 2009 [month] => 1 [day] => 6 [hour] => 13 [minute] => 0 [second] => 0 [fraction] => 0 [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => 1 [zone_type] => 1 [zone] => -60 [is_dst] => )
Пример #2 Пример предупреждения при разборе строки с датой функцией date_parse_from_format()
<?php
$date = "26 August 2022 22:30 pm";
$parsed = date_parse_from_format("j F Y G:i a", $date);
echo "Количество предупреждений: ", $parsed['warning_count'], "\n";
foreach ($parsed['warnings'] as $position => $message) {
echo "\tПозиция {$position}: {$message}\n";
}Результат выполнения приведённого примера:
Количество предупреждений: 1 Позиция 23: The parsed time was invalid
Пример #3 Пример ошибок при разборе строки с датой функцией date_parse_from_format()
<?php
$date = "26 August 2022 CEST";
$parsed = date_parse_from_format("j F Y H:i", $date);
echo "Количество ошибок: ", $parsed['error_count'], "\n";
foreach ($parsed['errors'] as $position => $message) {
echo "\tПозиция {$position}: {$message}\n";
}Результат выполнения приведённого примера:
Количество ошибок: 3 Позиция 15: A two digit hour could not be found Позиция 19: Not enough data available to satisfy format
It seems that the safest way to check for errors is not by checking the number of errors, but warnings instead. See the following example where "m" and "d" are swapped and thus not correct.
<?php
var_dump( date_parse_from_format('m.d.Y', '18.10.2024') );
OUTPUT:
array(12) {
["year"]=>
int(2024)
["month"]=>
int(18)
["day"]=>
int(10)
["hour"]=>
bool(false)
["minute"]=>
bool(false)
["second"]=>
bool(false)
["fraction"]=>
bool(false)
["warning_count"]=>
int(1)
["warnings"]=>
array(1) {
[10]=>
string(27) "The parsed date was invalid"
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}
["is_localtime"]=>
bool(false)
}
?>
The function simply assigns 18 to the "month" field without errors!! So simply use an if-condition and check "warning_count" to detect possible errors.