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

前端 未结 16 2316
名媛妹妹
名媛妹妹 2020-11-22 17:02

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,

相关标签:
16条回答
  • 2020-11-22 17:43

    Determine if string is a date, even if string is a non-standard format

    (strtotime doesn't accept any custom format)

    <?php
    function validateDateTime($dateStr, $format)
    {
        date_default_timezone_set('UTC');
        $date = DateTime::createFromFormat($format, $dateStr);
        return $date && ($date->format($format) === $dateStr);
    }
    
    // These return true
    validateDateTime('2001-03-10 17:16:18', 'Y-m-d H:i:s');
    validateDateTime('2001-03-10', 'Y-m-d');
    validateDateTime('2001', 'Y');
    validateDateTime('Mon', 'D');
    validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
    validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
    validateDateTime('03.10.01', 'm.d.y');
    validateDateTime('10, 3, 2001', 'j, n, Y');
    validateDateTime('20010310', 'Ymd');
    validateDateTime('05-16-18, 10-03-01', 'h-i-s, j-m-y');
    validateDateTime('Monday 8th of August 2005 03:12:46 PM', 'l jS \of F Y h:i:s A');
    validateDateTime('Wed, 25 Sep 2013 15:28:57', 'D, d M Y H:i:s');
    validateDateTime('17:03:18 is the time', 'H:m:s \i\s \t\h\e \t\i\m\e');
    validateDateTime('17:16:18', 'H:i:s');
    
    // These return false
    validateDateTime('2001-03-10 17:16:18', 'Y-m-D H:i:s');
    validateDateTime('2001', 'm');
    validateDateTime('Mon', 'D-m-y');
    validateDateTime('Mon', 'D-m-y');
    validateDateTime('2001-13-04', 'Y-m-d');
    
    0 讨论(0)
  • 2020-11-22 17:44

    Validate with checkdate function:

    $date = '2019-02-30';
    
    $date_parts = explode( '-', $date );
    
    if(checkdate( $date_parts[1], $date_parts[2], $date_parts[0] )){
        //date is valid
    }else{
        //date is invalid
    }
    
    0 讨论(0)
  • 2020-11-22 17:44
    /*********************************************************************************
    Returns TRUE if the input parameter is a valid date string in "YYYY-MM-DD" format (aka "MySQL date format")
    The date separator can be only the '-' character.
    *********************************************************************************/
    function isMysqlDate($yyyymmdd)
    {
        return checkdate(substr($yyyymmdd, 5, 2), substr($yyyymmdd, 8), substr($yyyymmdd, 0, 4)) 
            && (substr($yyyymmdd, 4, 1) === '-') 
            && (substr($yyyymmdd, 7, 1) === '-');
    }
    
    0 讨论(0)
  • 2020-11-22 17:46

    Accordling with cl-sah's answer, but this sound better, shorter...

    function checkmydate($date) {
      $tempDate = explode('-', $date);
      return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
    }
    

    Test

    checkmydate('2015-12-01');//true
    checkmydate('2015-14-04');//false
    
    0 讨论(0)
  • 2020-11-22 17:47

    This option is not only simple but also accepts almost any format, although with non-standard formats it can be buggy.

    $timestamp = strtotime($date);
    return $timestamp ? $date : null;
    
    0 讨论(0)
  • 2020-11-22 17:48

    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 && $d->format($format) === $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
    

    Demo!

    0 讨论(0)
提交回复
热议问题