Hi I seem to be having trouble getting the datetime method to work as expected? I may be doing something wrong?
// 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);
The thing about DateTime::createFromFormat
is that there are two kinds of unexpected input it recognizes: the kind that generates errors, and the kind that generates warnings.
Input such as '56/56/fail'
produces an error, so false
is returned and everything is good. However, '56/56/2012'
gives not an error but a warning, and is actually parsed as the 56th day of the 56th month of 2012. Since 2012 does not have 56 months, PHP internally changes this to 2016 + 8 months = Aug 2016. And since that month does not have 56 days, we have another compensation to Sep 2016 + (56 - 31) days = 25 Sep 2016. So while unexpected, this is in fact correct.
If you want to disallow this automatic adjustment, you have to wrap the DateTime
factory method and use DateTime::getLastErrors
as reference:
$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";
}
See it in action.
PHP is a strange beast (to say the least). 56/56/2012
results in all additional months and days to be added to the date until it becomes correct (god only knows the logic behind this).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With