14

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

$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”,

嗯?我从 0000-00-00 到 1999-11-30 ???

我知道我可以进行比较以查看日期是否与我拥有的日期相等,但这不是一种非常可靠的检查方式。有什么好方法可以检查我是否有一个有效的日期?任何人都有一个很好的功能来检查这个?

编辑:人们在问我在运行什么:在 Linux localhost 2.6.18-53.1.14.el5 #1 SMP Wed Mar 5 11 上运行 PHP 5.2.5 (cli)(构建时间:2008 年 7 月 23 日 11:32:27) :36:49 EST 2008 i686 i686 i386 GNU/Linux

4

10 回答 10

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;
}
?>
于 2008-09-26T19:15:01.217 回答
5

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

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

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

>> 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'
于 2012-03-29T21:07:19.120 回答
2

echo date('Ymd', strtotime($date));

结果:“1999-11-30”

结果是 943920000 - 这是从Unix 纪元(测量时间的基准)到 1999-11-30strtotime之间的大致秒数。

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

由于时间戳是从 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);
}
于 2008-09-26T19:11:25.627 回答
1

当您超出范围时,不要期望获得一致的结果:

cf strtotime

cf Gnu 日历-日期-项目.html

“对于数字月份,允许使用 ISO 8601 格式‘年-月-日’,其中年是任何正数, 月是介于 01 和 12 之间的数字日是介于 01 和 31 之间的数字。前导零必须是如果数字小于十,则存在。”

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


“此外,并非所有平台都支持负时间戳,因此您的日期范围可能会限制为不早于 Unix 纪元。这意味着例如 %e、%T、%R 和 %D(可能还有更多)以及之前的日期1970 年 1 月 1 日将无法在 Windows、某些 Linux 发行版和其他一些操作系统上运行。”

cf strftime


改用checkdate函数(更健壮):

月份:月份介于 1 和 12 之间

day:日期在给定月份的允许天数内。闰年被考虑在内。

year:年份在 1 到 32767 之间

于 2008-09-29T12:07:04.607 回答
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));
}
于 2010-01-15T06:16:58.837 回答
1

此版本允许字段为空,具有 mm/dd/yy 或 mm/dd/yyyy 格式的日期,允许单个数字小时,添加可选的 am/pm,并纠正时间匹配中的一些细微缺陷。

仍然允许一些病态时间,例如“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;
}
于 2011-01-05T15:41:28.257 回答
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" ;
    }
}
?>
于 2012-01-20T08:29:44.750 回答
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
于 2012-03-16T18:08:34.630 回答
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);
}
于 2012-04-25T10:03:22.563 回答
-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;
}
?>
于 2011-09-19T18:27:36.493 回答