2008-09-26 65 views
13

有没有一种方法来检查,看是否有日期/时间,你会觉得这些很容易检查有效:PHP检查有效日期,奇怪的日期转换

我什么是真正得到这样的:

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

结果: “1999-11-30”,

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

我知道我可以做比较,看看日期是否是这些值中的任何一个等于我的日期,但它不是一个非常健壮的方式来检查。有没有好的方法来检查我是否有有效日期?任何人都有很好的功能来检查这个?

编辑: 人都在问什么,我跑: 运行PHP 5.2.5(CLI)(建:2008年7月23日十一点32分27秒),在Linux上本地主机2.6.18-53.1.14.el5# 1 SMP Wed Mar 5 11:36:49 EST 2008 i686 i686 i386 GNU/Linux

+0

这是什么版本的PHP? – Swati 2008-09-26 19:09:31

+0

试试这个:http://php.net/manual/en/function.checkdate.php – 2012-02-19 19:24:53

+0

strtotime(“0000-00-00 00:00:00”)在32位系统上返回FALSE。 \t strtotime(“0000-00-00 00:00:00”)在64位系统上返回-62169955200。 – 2012-11-21 09:58:04

回答

22

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; 
} 
?> 
2

echo date('Ym-d',strtotime($ date));

结果在:“1999-11-30”

strtotime结果是943920000 - 这是秒,大致数量,Unix epoch(碱从其中时间被测量)到1999-之间11-30。

有一个记录mysql bugmktime(), localtime(), strtotime()所有返回这个奇怪的值,当您尝试一个划时代前时间(包括“0000-00-00 00:00:00”)。有链接的线程上的一些争论,这是否实际上是一个错误:

由于时间戳从1970年开始,我不认为它应该 工作反正。

下面是一个函数,我用它来将dateTimes转换成比较等的时间戳,对于超过“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); 
} 
+0

我试过日期('Ym-d',convert_date_string('0000-00-00 00:00:00')),但仍然给出了1999年的日期 – SeanDowney 2008-09-26 19:19:37

+0

发现PHP bug报告对PHP中基于时间函数的奇怪行为为0000-00 ..值。关于这个线程有一些争论,是否它实际上是一个错误,就好像人们会想在1970年之前计算一个日期一样! – ConroyP 2008-09-26 19:24:35

1

当你出门在外的范围内不要期望一致的结果:

CF strtotime

CF Gnu Calendar-date-items的.html

“对于数字月份,在ISO 8601 格式 '年 - 月 - 日' 是允许的, 其中year是任意正数, 一个月是01 和12之间的数字,以及天是 的数字,介于01和31之间。一个 前导零必须存在,如果 数量小于十。 “

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


” 此外, 并非所有的 平台都支持负时间戳,因此您的日期范围可能为 ,因此不得早于Unix 时期。这意味着例如 %E,%T,%R和%d(有可能是 更多)和日期前一月 1,1970年将不会在Windows,一些 Linux发行版,和其他几个 操作系统。”

CF strftime


使用checkdate函数,而不是(更强大的):

月份: 月份介于1和12之间,包括

日期: 当天在给定的 月份的允许天数之内。考虑到闰年为 。

year: year is between 1 and 32767 including

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)); 
} 
1

该版本允许字段是空的,以MM/DD/YY或毫米/ 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; 
} 
-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; 
} 
?> 
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" ; 
    } 
} 
?> 
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 
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' 
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); 
}