(PHP 4, PHP 5)
checkdate — Prüft ein Gregorianisches Datum auf Gültigkeit
Prüft die Gültigkeit des durch die Funktionsargumente beschriebenen Datums. Ein Datum wird als gültig betrachtet, wenn jeder Parameter korrekt definiert wurde.
Die Monatsangabe umfasst Werte von 1 bis 12 (inklusive).
Der Tag ist in der erlaubten Anzahl von Tagen für den angegebenen Monat month. Schaltjahre werden entsprechend berücksichtigt.
Die Jahresangabe ist eine Zahl zwischen 1 und 32767 (inklusive).
Gibt TRUE zurück, wenn das übergebene Datum gültig ist, andernfalls FALSE.
Beispiel #1 checkdate()-Beispiel
<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(true) bool(false)
Advanced Leap year function
<?php
function is_leap($year = null)
{
switch ($year) {
case strpos('+', $year):
$chunk = explode('+', $year);
return checkdate(2, 29, date('Y') + (int)$chunk[1]);
break;
default:
return checkdate(2, 29, ($year == null) ? date('Y') : (int)$year);
}
}
//Usage
if (is_leap()) {
echo "Current Year is a leap year";
}
if (is_leap(1992)) {
"1992 was a leap year";
}
if (is_leap( + 4)) {
"In four years it will be a leap year";
}
?>
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
)
);
?>
[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;
}
?>
<?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;
}
}
}
?>
<?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','-');
?>
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) >= 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 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.]
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');
?>
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 );
}
?>
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) == 1 // No tokens
and is_numeric($date[0])
and $date[0] < 20991231 and
( checkdate(substr($date[0], 4, 2)
, substr($date[0], 6, 2)
, substr($date[0], 0, 4)))
)
{
return true;
}
if( count($date) == 3
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;
}
?>
<?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, -1, PREG_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]) == 4 && $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
?>
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();
}
}
?>
for funny leap year detection:
<?php
function is_leap($year=NULL) {
return checkdate(2, 29, ($year==NULL)? date('Y'):$year); // true if is a leap year
}
?>
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;
}
?>
for checking the rime use this:
<?php
function checktime($hour, $minute) {
if ($hour > -1 && $hour < 24 && $minute > -1 && $minute < 60) {
return true;
}
}
?>
<?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;
}
?>
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;
}
?>
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;
}
?>