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 (первый день мая)!

Это делается за кулисами

Другие вопросы по тегам