php检查有效日期,奇怪的日期转换

时间:2008-09-26 19:05:22

标签: php date time strtotime

有没有办法检查日期/时间是否有效你会认为这些很容易检查:

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

if(strtotime($dateTime)) {
    // why is this valid?
}

真正让我感到的是:

echo date('Y-m-d', strtotime($date)); 

结果:“1999-11-30”,

是吗?我去了1999-11-30 ????

我知道我可以进行比较,看看日期是否等于我所拥有的日期,但它不是一个非常强大的检查方式。有没有一个好方法来检查我是否有一个有效的约会?任何人都有很好的功能来检查这个?

编辑: 人们在问我在跑什么: 在Linux localhost 2.6.18-53.1.14.el5#1 SMP Wed Mar 5 11:36:49 EST 2008 i686 i686 i386 GNU / Linux的

10 个答案:

答案 0 :(得分:23)

来自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;
}
?>

答案 1 :(得分:5)

如上所述:https://bugs.php.net/bug.php?id=45647

  

这里没有错误,00-00-00表示2000-00-00,即1999-12-00,   这是1999-11-30。没有错误,完全正常。

正如一些测试所示,向后滚动是预期的行为,如果有点不安:

>> 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'

答案 2 :(得分:2)

  

回音日期('Y-m-d',strtotime($ date));

     

结果:“1999-11-30”

strtotime的结果是943920000 - 这是大约在Unix epoch(测量时间的基础)到1999-11-30之间的秒数。

mktime(), localtime(), strtotime()上有一个记录mysql bug ,当你尝试一个前纪元时间(包括“00:00: 00" )。在链接的线程上有一些关于这是否真的是一个错误的争论:

  

由于时间戳是从1970年开始的,我认为不应该这样   无论如何都要工作。

下面是一个函数,我用它将上面的dateTimes转换为比较等的时间戳,对于你来说可能有用,对于超过“0000-00-00 00:00:00”的日期< / p>

/**
 * Converts strings of the format "YYYY-MM-DD HH:MM:SS" into php dates
 */
function convert_date_string($date_string)
{
    list($date, $time) = explode(" ", $date_string);
    list($hours, $minutes, $seconds) = explode(":", $time);
    list($year, $month, $day) = explode("-", $date);
    return mktime($hours, $minutes, $seconds, $month, $day, $year);
}

答案 3 :(得分:1)

当你超出范围时,不要指望连贯的结果:

cf strtotime

cf Gnu Calendar-date-items。html

  

“数字月份,ISO 8601   格式'年 - 月 - 日'是允许的,   哪一年是正数,   月是01之间的数字   和12 日是一个   数字介于01和31之间。一个   如果a,必须存在前导零   数字少于十。“

所以'0000-00-00'给出了奇怪的结果,这是合乎逻辑的!


  

“此外,并非全部   平台支持负时间戳,   因此你的日期范围可能是   限于不早于Unix   历元即可。这意味着,例如   %e,%T,%R和%D(可能有   更多)和日期之前的日期   一些,1970年将无法在Windows上运行   Linux发行版,以及其他一些   操作系统。“

cf strftime


使用checkdate功能代替(更强大):

  

月:       月份介于1到12之间

     

日:       这一天是在给定的允许天数内   月。闰年采取   考虑到。

     

年:       年份介于1到32767之间

答案 4 :(得分:1)

如果你只是想在没有mysql日期字段的情况下处理日期转换,你可以像我一样修改这个优秀的代码。 在我没有执行此功能的PHP版本上,我每次都会收到“0000-00-00”。烦人。

function ConvertDateString ($DateString)
{
    list($year, $month, $day) = explode("-", $DateString);
    return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year));
}

答案 5 :(得分:1)

此版本允许该字段为空,日期为mm / dd / yy或mm / dd / yyyy格式,允许单位数小时,添加可选的上午/下午,并纠正时间匹配中的一些细微缺陷

仍允许某些病态时间,如'23:14 AM'。

function isValidDateTime($dateTime) {
    if (trim($dateTime) == '') {
        return true;
    }
    if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})(\s+(([01]?[0-9])|(2[0-3]))(:[0-5][0-9]){0,2}(\s+(am|pm))?)?$/i', $dateTime, $matches)) {
        list($all,$mm,$dd,$year) = $matches;
        if ($year <= 99) {
            $year += 2000;
        }
        return checkdate($mm, $dd, $year);
    }
    return false;
}

答案 6 :(得分:0)

我刚刚改变了上面的马丁答案,这将验证任何类型的日期并以您喜欢的格式返回。

只需通过编辑下面的脚本行来更改格式 strftime(“10-10-2012”,strtotime($ dt));

<?php
echo is_date("13/04/10");

function is_date( $str ) {
    $flag = strpos($str, '/');

    if(intval($flag)<=0){
        $stamp = strtotime( $str );
    } else {
        list($d, $m, $y) = explode('/', $str);    
        $stamp = strtotime("$d-$m-$y");
    } 
    //var_dump($stamp) ;

    if (!is_numeric($stamp)) {
        //echo "ho" ;
        return "not a date" ;        
    }

    $month = date( 'n', $stamp ); // use n to get date in correct format
    $day   = date( 'd', $stamp );
    $year  = date( 'Y', $stamp );

    if (checkdate($month, $day, $year)) {
        $dt = "$year-$month-$day" ;
        return strftime("%d-%b-%Y", strtotime($dt));
        //return TRUE;
    } else {
        return "not a date" ;
    }
}
?>

答案 7 :(得分:0)

<?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

答案 8 :(得分:0)

我使用以下代码验证来自ExtJS应用程序的日期。

function check_sql_date_format($date) {
    $date = substr($date, 0, 10);
    list($year, $month, $day) = explode('-', $date);
    if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) {
        return false;
    }
    return checkdate($month, $day, $year);
}

答案 9 :(得分:-1)

<?php

function is_date( $str ) {
    $stamp = strtotime( $str );

    if (!is_numeric($stamp)) {
        return FALSE;
    }
    $month = date( 'm', $stamp );
    $day   = date( 'd', $stamp );
    $year  = date( 'Y', $stamp );

    if (checkdate($month, $day, $year)) {
        return TRUE;
    }
    return FALSE;
}
?>