php check for a valid date, weird date conversions

后端 未结 10 696
盖世英雄少女心
盖世英雄少女心 2020-12-10 04:13

Is there a way to check to see if a date/time is valid you would think these would be easy to check:

$date = \'0000-00-00\';
$time = \'00:00:00\';
$dateTime          


        
相关标签:
10条回答
  • 2020-12-10 04:25

    Don't expect coherent results when you're out of range:

    cf strtotime

    cf Gnu Calendar-date-items.html

    "For numeric months, the ISO 8601 format ‘year-month-day’ is allowed, where year is any positive number, month is a number between 01 and 12, and day is a number between 01 and 31. A leading zero must be present if a number is less than ten."

    So '0000-00-00' gives weird results, that's logical!


    "Additionally, not all platforms support negative timestamps, therefore your date range may be limited to no earlier than the Unix epoch. This means that e.g. %e, %T, %R and %D (there might be more) and dates prior to Jan 1, 1970 will not work on Windows, some Linux distributions, and a few other operating systems."

    cf strftime


    Use checkdate function instead (more robust):

    month: The month is between 1 and 12 inclusive.

    day: The day is within the allowed number of days for the given month. Leap year s are taken into consideration.

    year: The year is between 1 and 32767 inclusive.

    0 讨论(0)
  • 2020-12-10 04:27
    <?php
    function is_valid_date($user_date=false, $valid_date = "1900-01-01") {
        $user_date = date("Y-m-d H:i:s",strtotime($user_date));
        return strtotime($user_date) >= strtotime($valid_date) ? true : false;
    }
    
    echo is_valid_date("00-00-00") ? 1 : 0;    // return 0
    
    echo is_valid_date("3/5/2011") ? 1 : 0;    // return 1
    
    0 讨论(0)
  • 2020-12-10 04:28

    From php.net

    <?php
    function isValidDateTime($dateTime)
    {
        if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $dateTime, $matches)) {
            if (checkdate($matches[2], $matches[3], $matches[1])) {
                return true;
            }
        }
    
        return false;
    }
    ?>
    
    0 讨论(0)
  • 2020-12-10 04:35

    As mentioned here: https://bugs.php.net/bug.php?id=45647

    There is no bug here, 00-00-00 means 2000-00-00, which is 1999-12-00, which is 1999-11-30. No bug, perfectly normal.

    And as shown with a few tests, rolling backwards is expected behavior, if a little unsettling:

    >> date('Y-m-d', strtotime('2012-03-00'))
    string: '2012-02-29'
    >> date('Y-m-d', strtotime('2012-02-00'))
    string: '2012-01-31'
    >> date('Y-m-d', strtotime('2012-01-00'))
    string: '2011-12-31'
    >> date('Y-m-d', strtotime('2012-00-00'))
    string: '2011-11-30'
    
    0 讨论(0)
提交回复
热议问题