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

$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的

有帮助吗?

解决方案

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

其他提示

如上所述: 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'
  

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

     

结果为:“1999-11-30”

strtotime 的结果是943920000 - 这是 Unix纪元(测量时间的基础)到1999-11-30。

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

  

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

以下是我用于将诸如上述的日期时间转换为用于比较的时间戳等的函数,对于超过“0000-00-00 00:00:00”的日期,这些函数可能对您有用。

/**
 * 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);
}

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

参见 strtotime

参见 Gnu Calendar-date-items html的

  

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

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


  

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

参见 strftime


使用 checkdate 功能(更强大):

  

月:       月份介于1到12之间

     

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

     

年:       年份介于1到32767之间

此版本允许该字段为空,日期为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;
}

如果你只是想在没有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));
}
<?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

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

只需通过编辑下面的脚本行来更改格式 strftime(&quot; 10-10-2012&quot;,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" ;
    }
}
?>

我使用以下代码验证来自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);
}
<?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;
}
?>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top