php DateTime createFromFormat функциональность
Привет у меня, кажется, есть проблемы с получением метода datetime для работы, как ожидалось? Может я что-то не так делаю?
// Passes OK
$dateTime = DateTime::createFromFormat('d/m/Y', '12/12/2012' );
var_dump($dateTime);
// should fail but returns - 2016-09-25
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012' );
var_dump($dateTime);
// correctly returns False
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/fail' );
var_dump($dateTime);
// should fail but returns 2019-08-29 09:58:10
$dateTime = DateTime::createFromFormat('m/d/Y', '90/90/2012' );
var_dump($dateTime);
3 ответа
Вещь о DateTime::createFromFormat
в том, что он распознает два типа неожиданных входных данных: тип, который генерирует ошибки, и тип, который генерирует предупреждения.
Ввод, такой как '56/56/fail'
выдает ошибку, так false
возвращается и все хорошо. Тем не мение, '56/56/2012'
выдает не ошибку, а предупреждение, и фактически анализируется как 56-й день 56-го месяца 2012 года. Поскольку в 2012 году нет 56 месяцев, PHP внутренне изменяет это на 2016 + 8 месяцев = август 2016 года. И поскольку этот месяц не у нас есть 56 дней, у нас есть еще одна компенсация к сентябрю 2016 года + (56 - 31) дней = 25 сентября 2016 года. Так что, хотя неожиданно, это на самом деле правильно.
Если вы хотите запретить эту автоматическую настройку, вам нужно DateTime
заводской метод и использование DateTime::getLastErrors
как ссылки:
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012');
$errors = DateTime::getLastErrors();
if (!empty($errors['warning_count'])) {
echo "Strictly speaking, that date was invalid!\n";
}
PHP странный зверь (по меньшей мере). 56/56/2012
приводит к добавлению всех дополнительных месяцев и дней к дате, пока она не станет правильной (бог знает только логику, стоящую за этим).
На самом деле это правильно: например, если вы создаете дату с 2012/04/31 (недопустимая дата), PHP возвращает 2012/05/01 (первый день мая)!
Это делается за кулисами