# PHP Dates and Times

• Print

## Checking the Validity of a Date

### Problem

You want to see whether the user has submitted a valid date.

### Solution

Use the checkdate() function, which validates a date in the format MM/DD/YYYY:

```<?php
list (\$month, \$day, \$year) = explode ('/', \$date);

if (checkdate (\$month, \$day, \$year)) {
print "Valid Date!";
} else {
print "Not Valid!";
}
?>```

### Discussion

checkdate() checks the validity of a date according to the following criteria:

• year is between 0 and 32767, inclusive.

• month is between 1 and 12, inclusive.

• day is within the allowed number of days for the given month. Leap years are taken into consideration.

This solution can also be easily implemented in PHP. Here is an example of how it might be done:

```<?php

function is_leap_year (\$year)
{
return (((\$year%4) == 0 && (\$year%100)!=0) || (\$year%400)==0);
}

function is_valid_date (\$date)
{
/* Split the date into component parts. */
list(\$month, \$day, \$year) = explode('/', \$date);
\$month_days = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

if (\$month < 1 || \$month > 12)
return false;

/* Year has to consist of 4 digits. */
if ((strlen(\$year) != 4) || eregi("[^0-9]", \$year))
return false;

/* If it's a leap year, February will have 29 days. */
if (is_leap_year(\$year))
\$month_days = 29;

if (\$day < 1 || \$day > \$month_days[\$month - 1])
return false;

return true;
}
?>```

The previous example first splits the date by "/" and assigns the returned array to \$month, \$day, and \$year. Then it simply tests whether each date part is within the specified range. This function also uses a little trick; \$day is a string, but when it's compared against numbers, it is automatically converted to a number. So, if \$day is not a numerical string, the result of the conversion will be 0, which is outside the specified range.