checkA.php,checkdate

用户评论:

[#1]

SDSurfer [2014-10-16 16:07:52]

Super graceful solution by glavic and the mod by Bas - the only thing I would add is if you have user input, you have the potential for really munged up values for date which can throw exceptions. Add a try/catch:

if (((int) $version[0] >= 5 && (int) $version[1] >= 2 && (int) $version[2] > 17)) {

try {  $d = DateTime::createFromFormat($format, $date); }

catch (Exception $e) {

if ($debug) { echo "Invalid date: " . $e->getMessage() . "
\n"; }

return false;

}

} else {

try { $d = new DateTime(date($format, strtotime($date))); }

catch (Exception $e) {

if ($debug) { echo "Invalid date: " . $e->getMessage() . "
\n"; }

return false;

}

}

[#2]

Bas [2014-02-20 11:59:43]

And here is a version which will work for PHP 5.2 also.

function ValidateDate($date, $format = 'Y-m-d H:i:s') {

$version = explode('.', phpversion());

if (((int) $version[0] >= 5 && (int) $version[1] >= 2 && (int) $version[2] > 17)) {

$d = DateTime::createFromFormat($format, $date);

} else {

$d = new DateTime(date($format, strtotime($date)));

}

return $d && $d->format($format) == $date;

}

[#3]

jdiosdado [2013-12-04 21:54:01]

There is an issue with glavic at gmail dot com answer:

var_dump(validateDate('9/21/1943', ''m/d/Y''));

The result will be false. 09/21/1943  =! 9/21/1943

[#4]

glavic at gmail dot com [2013-09-12 12:46:32]

With DateTime you can make the shortest date&time validator for all formats.

function validateDate($date, $format = 'Y-m-d H:i:s')

{

$d = DateTime::createFromFormat($format, $date);

return $d && $d->format($format) == $date;

}

var_dump(validateDate('2012-02-28 12:12:12')); # true

var_dump(validateDate('2012-02-30 12:12:12')); # false

var_dump(validateDate('2012-02-28', 'Y-m-d')); # true

var_dump(validateDate('28/02/2012', 'd/m/Y')); # true

var_dump(validateDate('30/02/2012', 'd/m/Y')); # false

var_dump(validateDate('14:50', 'H:i')); # true

var_dump(validateDate('14:77', 'H:i')); # false

var_dump(validateDate(14, 'H')); # true

var_dump(validateDate('14', 'H')); # true

var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Y-m-d\TH:i:sP')); # true

# or

var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true

var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d M Y H:i:s O')); # true

# or

var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true

var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false

# ...

[#5]

admin at limitsizbilgi dot com [2013-07-16 14:40:00]

function DDC($dates){ // Date Day Control

$dy = substr($dates,0,4);

$dm = substr($dates,5,2);

$dd = substr($dates,8,2);

for($i=0; $i<3; $i++){

if(!checkdate($dm,$dd,$dy)){

$dd--;

}else{$i=3;}

}

return $dy.'.'.$dm.'.'.$dd;

}

echo DDC('2013.02.31');

//2013.02.28

[#6]

mohammed dot aas2012 at gmail dot com [2012-11-07 11:23:21]

format should be in array like: array("m","d","y")

if(is_array($format) &&count($format) ==3&&count(explode($ex,$strDate))==3)

{$date=array_combine($format,explode($ex,$strDate));

if(intval($date['m']) &&intval($date['d']) &&intval($date['y'])){$m=$date['m'];$d=$date['d'];$y=$date['y'];$valid=checkdate($m,$d,$y);

}

}

return$valid;

}?>

[#7]

bharath.kishore.a AT gmail. DOT com [2012-03-07 14:00:13]

Here is another crooked way to check if given data is valid DATETIME or not.

function checkDateTime($data) {

if (date('Y-m-d H:i:s', strtotime($data)) == $data) {

return true;

} else {

return false;

}

}

[#8]

rfeugenio at gmail dot com [2009-03-26 22:21:19]

for ($day=31;$day>=28;$day--) {

if (checkdate($month,$day,$year)) {

return$day;

}

}

}?>

[#9]

James Luckhurst [2009-03-22 16:26:44]

switch($s_from) {

case'eng':# dd/mm/yyyy$day=$a_date[0];$month=$a_date[1];$year=$a_date[2];

break;

case'usa':# mm/dd/yyyy$month=$a_date[0];$day=$a_date[1];$year=$a_date[2];

break;

case'iso':# yyyy/mm/dd$year=$a_date[0];$month=$a_date[1];$day=$a_date[2];

break;

default:# error messageuser_error('function convertdate(string $s_date, string $s_from, string $s_to, string $s_return_delimiter) $s_from not a valid type of \'eng\', \'usa\' or \'iso\'');

returnNULL;

}# substitution fixes of valid alternative human input e.g. 1/12/08if (strlen($day)==1) {$day='0'.$day; }# day -trailing zero missingif (strlen($month)==1) {$month='0'.$month; }# month -trailing zero missingif (strlen($year)==3) {$year=substr(date('Y'),0,strlen(date('Y'))-3).$year; }# year -millennium missingif (strlen($year)==2) {$year=substr(date('Y'),0,strlen(date('Y'))-2).$year; }# year -century missingif (strlen($year)==1) {$year=substr(date('Y'),0,strlen(date('Y'))-1).$year; }# year -decade missingswitch($s_to) {

case'eng':# dd/mm/yyyy$s_return_date=$day.$s_return_delimiter.$month.$s_return_delimiter.$year;

break;

case'usa':# mm/dd/yyyy$s_return_date=$month.$s_return_delimiter.$day.$s_return_delimiter.$year;

break;

case"iso":# yyyy/mm/dd$s_return_date=$year.$s_return_delimiter.$month.$s_return_delimiter.$day;

break;

default:# error messageuser_error('function convertdate(string $s_date, string $s_from, string $s_to, string $s_return_delimiter) $s_to not a valid type of \'eng\', \'usa\' or \'iso\'');

returnNULL;

}# if it's an invalid calendar date e.g. 40/02/2009 or rt/we/garbageif (!is_numeric($month) || !is_numeric($day) || !is_numeric($year)) {

returnNULL;

} elseif (!checkdate($month,$day,$year)) {

returnNULL;

}

return$s_return_date;

}

echoconvertdate('13/04/2009','eng','iso','-');?>

[#10]

ystein M [2009-03-18 05:51:56]

I think there is an error in the function from bmauser below. $regexp is overwritten. Here's another version which also accepts missing zeros and two digits year notation.

This function checks date if matches given format and validity of the date.

if(strlen($value) >=6&&strlen($format) ==10){// find separator. Remove all other characters from $format$separator_only=str_replace(array('m','d','y'),'',$format);$separator=$separator_only[0];// separator is first characterif($separator&&strlen($separator_only) ==2){// make regex$regexp=str_replace('mm','(0?[1-9]|1[0-2])',$format);$regexp=str_replace('dd','(0?[1-9]|[1-2][0-9]|3[0-1])',$regexp);$regexp=str_replace('yyyy','(19|20)?[0-9][0-9]',$regexp);$regexp=str_replace($separator,"\\".$separator,$regexp);

if($regexp!=$value&&preg_match('/'.$regexp.'\z/',$value)){// check date$arr=explode($separator,$value);$day=$arr[0];$month=$arr[1];$year=$arr[2];

if(@checkdate($month,$day,$year))

returntrue;

}

}

}

returnfalse;

}?>

[NOTE BY danbrown AT php DOT net: Original function was written by (bmauser AT gmail) on 16-DEC-2008.]

[#11]

sebagr@gmail [2009-03-04 09:20:29]

Here's a nice snippet to check if user input is valid:

$date_format='Y-m-d';$input='2009-03-03';$input=trim($input);$time=strtotime($input);$is_valid=date($date_format,$time) ==$input;

print"Valid? ".($is_valid?'yes':'no');?>

[#12]

venadder at yahoo dot ca [2009-01-21 22:49:12]

Here is a simple IsDate function, using purely PHP functions( A Check for $Stamp can be added to see if it's a legal Unix timestamp ):

{$Stamp=strtotime($Str);$Month=date('m',$Stamp);$Day=date('d',$Stamp);$Year=date('Y',$Stamp);

returncheckdate($Month,$Day,$Year);

}?>

[#13]

a34 at yahoo dot com [2007-07-09 05:21:57]

checkData function posted below does not consider a date entered such as 03/27c/2000.   The c will cause it to crash.  Here is the fix.

list($yy,$mm,$dd)=explode("-",$mydate);

if (is_numeric($yy) &&is_numeric($mm) &&is_numeric($dd))

{

returncheckdate($mm,$dd,$yy);

}

returnfalse;

}?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值