php DateTime createFromFormat функциональность

Привет у меня, кажется, есть проблемы с получением метода datetime для работы, как ожидалось? Может я что-то не так делаю?

<code>// 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);
</code>

enter image description here

Ответы на вопрос(3)

56/56/2012 приводит к добавлению всех дополнительных месяцев и дней к дате, пока она не станет правильной (бог знает только логику, стоящую за этим).

 14 янв. 2015 г., 13:08
Я подозреваю, что логика в том, что это позволяет программисту выполнять ленивые вычисления даты. Если вы хотите добавить к чему-то 90 дней или 18 месяцев, вы можете просто вставить цифры без выполнения вычислений, оборачивая месяцы / годы самостоятельно и т. Д., И PHP разберется с вами и вернет то, что вы хотите.
Решение Вопроса

DateTime::createFromFormat что естьtwo виды неожиданного ввода, которые он распознает: тип, который генерирует ошибки, и тип, который генерирует предупреждения.

Ввод, такой как'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";
}

Увидеть это в действии.

 Robbo_UK12 апр. 2012 г., 11:50
Спасибо за ответ. Был 100% спот и очень хорошо объяснил.
 26 февр. 2016 г., 13:14
Чтобы проверка была готова к копированию / вставке, она также должна иметь начальную проверку: if (! $ DateTime ||! Empty ($ errors [& apos; warning_count & apos;])) {:)

например, если вы создаете дату с 2012/04/31 (недопустимая дата), PHP возвращает 2012/05/01 (первый день мая)!

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

Ваш ответ на вопрос