Search code examples
phpdatedatetime

Correctly determine if date string is a valid date in that format


I'm receiving a date string from an API, and it is formatted as yyyy-mm-dd.

I am currently using a regex to validate the string format, which works ok, but I can see some cases where it could be a correct format according to the string but actually an invalid date. i.e. 2013-13-01, for example.

Is there a better way in PHP to take a string such as 2013-13-01 and tell if it is a valid date or not for the format yyyy-mm-dd?


Solution

  • You can use DateTime::createFromFormat() for this purpose:

    function validateDate($date, $format = 'Y-m-d')
    {
        $d = DateTime::createFromFormat($format, $date);
        // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
        return $d && strtolower($d->format($format)) === strtolower($date);
    }
    

    [Function taken from this answer. Also on php.net. Originally written by Glavić.]


    Test cases:

    var_dump(validateDate('2013-13-01'));  // false
    var_dump(validateDate('20132-13-01')); // false
    var_dump(validateDate('2013-11-32'));  // false
    var_dump(validateDate('2012-2-25'));   // false
    var_dump(validateDate('2013-12-01'));  // true
    var_dump(validateDate('1970-12-01'));  // true
    var_dump(validateDate('2012-02-29'));  // true
    var_dump(validateDate('2012', 'Y'));   // true
    var_dump(validateDate('12012', 'Y'));  // false
    var_dump(validateDate('2013 DEC 1', 'Y M j'));  // true
    

    Demo!