Date/Time 函数
在线手册:中文  英文

checkdate

(PHP 4, PHP 5)

checkdate验证一个格里高里日期

说明

bool checkdate ( int $month , int $day , int $year )

检查由参数构成的日期的合法性。如果每个参数都正确定义了则会被认为是有效的。

参数

month

month 的值是从 1 到 12。

day

Day 的值在给定的 month 所应该具有的天数范围之内,闰年已经考虑进去了。

year

year 的值是从 1 到 32767。

返回值

如果给出的日期有效则返回 TRUE,否则返回 FALSE

范例

Example #1 checkdate() 例子

<?php
var_dump
(checkdate(12312000));
var_dump(checkdate(2292001));
?>

以上例程会输出:

bool(true)
bool(false)

参见


Date/Time 函数
在线手册:中文  英文

用户评论:

nisspaATgmail (2013-02-08 12:10:02)

Function to increment date by one day...
<?php 

function DateIncrement (&$year,  &$month, &$day)
{
      if(!
checkdate($month$day$year)){
            if (!
checkdate ($month$day +1$year)
            {
                if (!
checkdate($month 11$year)
        {
                    
$month 1;
                    
$year $year +1;
                    
$day =1;
                          return 
false;
                }else
        {
                    
$month $month +1;
                    
$day 1;
                          return 
false;
                } 
             } else {
                
$day $day 1;
                        return 
false;
             }
        }else{
            return 
true;
        }
}        

?>

mohammed dot aas2012 at gmail dot com (2012-11-07 11:23:21)

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

<?php
function isValidDate($strDate,$format,$ex) {
      
$valid false;
      if(
is_array($format) && count($format) == && 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;
   }
?>

Martin Kuchar (2012-08-25 00:19:20)

It may be also used with strings and also with leading zero:
checkdate("03","08","2012") is TRUE

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

Anonymous (2012-02-14 11:10:58)

This is a very good function to check if a date format is valid (with regex). 

For example:

2012-2-28 = Valid
2012-2-29 = Valid (leap year)
2012-2-30 = Invalid

2012-1-30 = Valid
2012-1-31 = Valid
2012-2-32 = Invalid

Ensure there are no spaces in the preg_match function:

<?php
  
function Valid_Date_Format($date)
  {
    
$converted=str_replace('/','-',$date);

    if(
preg_match("/^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|
(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|
(1[0-2]))-(29|30)))))$/"
,$converted)===1)
    {
      return 
TRUE;
    }

    return 
FALSE;
  } 
?>

I don't know where I got the original code from but I've not found anything better.

pradeepkumarprajapati3 at yahoo dot co dot in (2011-12-18 23:23:38)

don't use strtotime() to format inputs to checkdate(). It would give false results.
Eg,
Below function would return true though it should have been false

<?php
$str 
'2011-11-31'//invalid date, november has 30 days only 
function isDateValid($str)
{
  
$stamp strtotime($str);
  if (!
is_numeric($stamp))
     return 
FALSE;
  
  
//checkdate(month, day, year)
  
if ( checkdate(date('m'$stamp), date('d'$stamp), date('Y'$stamp)) )
  {
     return 
TRUE;
  }
  return 
FALSE;
}
?>

The reason is that strtotime() coverts 2011-11-31 to 2011-12-01.
check with date('Y-m-d', strtotime('2011-11-31'))

Anonymous (2009-07-13 12:06:48)

Beware that checkdate can not be used as validation to check if a date is correct.

The example below will return bool(true) which can result that the <script> part is inserted into the database.

<?php

$date 
"01-01-1980 <script>alert('test');</script>";
$aDate_parts preg_split("/[\s-]+/"$date);

var_dump(
    
checkdate(
        
$aDate_parts[1], // Month
        
$aDate_parts[0], // Day
        
$aDate_parts[2// Year
    
)
);

?>

iamcanadian1973 at gmail dot com (2009-04-16 21:37:23)

[NOTE BY danbrown AT php DOT net: The author's purpose for this function is to determine whether or not a given string $str is a date using a static algorithm.]

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

rfeugenio at gmail dot com (2009-03-26 22:21:19)

<?php

// This is a simple function that will get the last day of the month.

function GetLastDayofMonth($year$month) {
    for (
$day=31$day>=28$day--) {
        if (
checkdate($month$day$year)) {
            return 
$day;
        }
    }    
}

?>

James Luckhurst (2009-03-22 16:26:44)

<?php 
/* 
## converts a given date format to another date format returns date if the checked date given is valid; otherwise returns NULL
## $s_date the date in e.g. dd/mm/yyyy
## $s_from, $s_to date formats from to i.e. convertdate('13/04/2009','eng','iso','-'); output: 2009-04-13
## date formats available
## 'eng' = dd/mm/yyyy
## 'usa' = mm/dd/yyyy
## 'iso' = yyyy/mm/dd
## $s_return_delimiter returned delimiter e.g. '-' would return dd-mm-yyyy 
*/
function convertdate($s_date,$s_from,$s_to,$s_return_delimiter) {

    
$s_return_date '';
    
$s_from strtolower($s_from);
    
$s_to strtolower($s_to);
    
$s_date str_replace(array('\'''-''.'','' '), '/'$s_date);
    
$a_date explode('/'$s_date); 
    
    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 message
            
user_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\'');
            return 
NULL;
    }

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

    
switch($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 message
            
user_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\'');
            return 
NULL;
    }

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

    return 
$s_return_date;


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

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.

<?php
/**
 * Checks date if matches given format and validity of the date.
 * Examples:
 * <code>
 * is_date('22.22.2222', 'mm.dd.yyyy'); // returns false
 * is_date('11/30/2008', 'mm/dd/yyyy'); // returns true
 * is_date('30-01-2008', 'dd-mm-yyyy'); // returns true
 * is_date('2008 01 30', 'yyyy mm dd'); // returns true
 * </code>
 * @param string $value the variable being evaluated.
 * @param string $format Format of the date. Any combination of <i>mm<i>, <i>dd<i>, <i>yyyy<i> 
 * with single character separator between.
 */
function is_valid_date($value$format 'dd.mm.yyyy'){
    if(
strlen($value) >= && 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 character
        
        
if($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))
                    return 
true;
            } 
        }
    }
    return 
false;
}
?>

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

sebagr@gmail (2009-03-04 09:20:29)

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

<?php 

$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');

?>

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 ):

<?php
function IsDate$Str )
{
  
$Stamp strtotime$Str );
  
$Month date'm'$Stamp );
  
$Day   date'd'$Stamp );
  
$Year  date'Y'$Stamp );

  return 
checkdate$Month$Day$Year );
}
?>

parris dot varney at gmail dot com (2008-12-10 19:24:40)

I put together an is_date function using checkdate.  Works the same as is_numeric.

<?php
    
public static function is_date($date)
    {
        
$date str_replace(array('\'''-''.'','), '/'$date);
        
$date explode('/'$date);

        if(    
count($date) == // No tokens
            
and    is_numeric($date[0])
            and    
$date[0] < 20991231 and
            (    
checkdate(substr($date[0], 42)
                        , 
substr($date[0], 62)
                        , 
substr($date[0], 04)))
        )
        {
            return 
true;
        }
        
        if(    
count($date) == 
            
and    is_numeric($date[0]) 
            and    
is_numeric($date[1])
            and 
is_numeric($date[2]) and
            (    
checkdate($date[0], $date[1], $date[2]) //mmddyyyy
            
or    checkdate($date[1], $date[0], $date[2]) //ddmmyyyy
            
or    checkdate($date[1], $date[2], $date[0])) //yyyymmdd
        
)
        {
            return 
true;
        }
        
        return 
false;
    }
?>

doob_ at gmx dot de (2008-11-26 08:47:01)

<?php

/*
** check a date
** dd.mm.yyyy || mm/dd/yyyy || dd-mm-yyyy || yyyy-mm-dd 
*/

function check_date($date) {
    if(
strlen($date) == 10) {
        
$pattern '/\.|\/|-/i';    // . or / or -
        
preg_match($pattern$date$char);
        
        
$array preg_split($pattern$date, -1PREG_SPLIT_NO_EMPTY); 
        
        if(
strlen($array[2]) == 4) {
            
// dd.mm.yyyy || dd-mm-yyyy
            
if($char[0] == "."|| $char[0] == "-") {
                
$month $array[1];
                
$day $array[0];
                
$year $array[2];
            }
            
// mm/dd/yyyy    # Common U.S. writing
            
if($char[0] == "/") {
                
$month $array[0];
                
$day $array[1];
                
$year $array[2];
            }
        }
        
// yyyy-mm-dd    # iso 8601
        
if(strlen($array[0]) == && $char[0] == "-") {
            
$month $array[1];
            
$day $array[2];
            
$year $array[0];
        }
        if(
checkdate($month$day$year)) {    //Validate Gregorian date
            
return TRUE;
        
        } else {
            return 
FALSE;
        }
    }else {
        return 
FALSE;    // more or less 10 chars
    
}
}

check_date('21.02.1983');
check_date('21-02-1983');
check_date('02/21/1983'); // Common U.S. writing
check_date('1983-02-21'); // iso 8601

?>

saturn at ax dot com dot tw (2008-08-25 23:06:01)

I wrote a simple function to converter datetime to UNIX timestamp. If the input time with error format, the function will return current timestamp.

<?php
function datetime2timestamp($datetime)
{
    
$datetime str_replace('-'' '$datetime);
    
$datetime str_replace('/'' '$datetime);
    
$datetime str_replace(':'' '$datetime);
    
$array explode(' '$datetime);

    
$year   $array[0];
    
$month  $array[1];
    
$day    $array[2];
    
$array[3] ? $hour   $array[3] : $hour   '00';
    
$array[4] ? $minute $array[4] : $minute '00';
    
$array[5] ? $second $array[5] : $second '00';
    
    if (
preg_match("/^(\d{4}) (\d{2}) (\d{2}) ([01][0-9]|2[0-3]) ([0-5][0-9]) ([0-5][0-9])$/""$year $month $day $hour $minute $second"$matches)) { 
        if (
checkdate($matches[2], $matches[3], $matches[1])) { 
        return 
mktime(intval($hour), intval($minute), intval($second), intval($month), intval($day), intval($year));
        } else {
        return 
time();
        }        
    } else {
    return 
time();
    }
}
?>

el dot vartauy__ at t__gmail dot com (2008-02-29 10:18:41)

for funny leap year detection:
<?php
function is_leap($year=NULL) {
    return 
checkdate(229, ($year==NULL)? date('Y'):$year); // true if is a leap year
}
?>

wasile_ro[at]yahoo[dot]com (2007-10-08 07:30:26)

here's a cool function to validate a mysql datetime:

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

jens wittmann (2007-08-28 08:29:22)

for checking the rime use this:

<?php
function checktime($hour$minute) {
    if (
$hour > -&& $hour 24 && $minute > -&& $minute 60) {
        return 
true;
    }
}
?>

brenig code (2007-08-14 11:21:45)

<?php

/**
* check a date combo of the 2 
*/
function checkData($date)
{
    if (!isset(
$date) || $date=="")
    {
        return 
false;
    }
   
    list(
$dd,$mm,$yy)=explode("/",$date);
    if (
$dd!="" && $mm!="" && $yy!="")
    {
    if (
is_numeric($yy) && is_numeric($mm) && is_numeric($dd))
        {
            return 
checkdate($mm,$dd,$yy);

        }
    }   
    return 
false;

}
?>

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.

<?php
function checkData($mydate) {
       
    list(
$yy,$mm,$dd)=explode("-",$mydate);
    if (
is_numeric($yy) && is_numeric($mm) && is_numeric($dd))
    {
        return 
checkdate($mm,$dd,$yy);
    }
    return 
false;            
}
?>

manuel84**at**mp4**dot**it (2006-12-04 07:49:44)

If you have a date like this gg/mm/aaaa and you'd like to verify that it is in the Italian Format you can use a function like this.
For other date format you can take this code and simply modify the list and explode line
<?php
/**
* check a date in the Italian format
*/
function checkData($date)
{
    if (!isset(
$date) || $date=="")
    {
        return 
false;
    }
    
    list(
$dd,$mm,$yy)=explode("/",$date);
    if (
$dd!="" && $mm!="" && $yy!="")
    {
        return 
checkdate($mm,$dd,$yy);
    }
    
    return 
false;
}
?>

易百教程