Sometimes you need to know compare PHP dates. You need to know what is later or if both dates are the same.
PHP ¶
time formats and functions ¶
PHP knows these time / date formats:
- UNIX Timestamp: Integer - The number of seconds after 1970. Related functions are
- int `mktime([ int \$hour = date("H") [, int \$minute = date("i") [, int \$second = date("s") [, int \$month = date("n") [, int \$day = date("j") [, int \$year = date("Y") [, int \$is_dst = -1 ]]]]]]])`
- int `time()`
- string `date( string \$format [, int $timestamp = time() ] )`
- int `strtotime( string \$time [, int \$now ] )` I recommend using `YYYY-MM-DD HH:mm:ss` if possible.
- Associative Arrays. The array looks like this
The related functions are:
Array ( [year] => 2006 [month] => 12 [day] => 12 [hour] => 10 [minute] => 0 [second] => 0 [fraction] => 0.5 [warning_count] => 0 [warnings] => Array() [error_count] => 0 [errors] => Array() [is_localtime] => )
- array date_parse (string $date)
- array getdate ([ int $timestamp = time() ] )
- DateTime Class: This class can do quite a lot. You should read the manual if you're interested in using it.
Comparisons ¶
Comparing UNIX Timestamps is like comparing integers. No problem.
Comparing Arrays is more interesting. What do you think will the following script print?
<?php
$d1 = date_parse ("2011-05-11");
$d2 = date_parse ("2011-05-11 13:00:00");
print_r($d1);
print_r($d2);
if ($d1 < $d2) {
echo '$d1 is less than $d2.';
} else if ($d1 == $d2) {
echo '$d1 is equal to $d2.';
} else {
echo '$d1 is greater than $d2.';
}
?>
It prints '$d1 is less than $d2.' as
date_parse ("2011-05-11");
is basically the same as
date_parse ("2011-05-11 00:00:00");
You can compare the Array to an integer, but I don't know what PHP does. It seems as if the array would always be considered as being greater. If you use the functions you'll be fine.
MySQL ¶
time formats and functions ¶
MySQL knows these date and time types and those functions. Here is a very short overview:
- DATETIME: 'YYYY-MM-DD HH:MM:SS' range is from '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
- DATE: 'YYYY-MM-DD' range is from '1000-01-01' to '9999-12-31'
- TIMESTAMP: like DATETIME, but range is from '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
Those examples show more than a long explanation:
mysql> SELECT CURTIME();
-> '23:50:26'
# Adding zero will NOT convert it to a UNIX timestamp:
mysql> SELECT CURTIME() + 0;
-> 235026.000000 # An "integered" TIME
mysql> SELECT NOW( )
-> '2011-10-04 18:33:45'
# Adding zero is a bad idea here, too:
mysql> SELECT NOW( ) +0
-> 20111004190945.000000 # An "integered" DATETIME
# If you want a UNIX Timestamp, use this function
mysql> SELECT UNIX_TIMESTAMP();
-> 1317746025
mysql> SELECT UNIX_TIMESTAMP('2011-10-04 18:33:45');
-> 1317746025
# You can also convert it:
mysql> SELECT UNIX_TIMESTAMP(`my_datetime_row`) FROM `my_table`
Comparisons ¶
You can compare two DATETIMEs like this:
SELECT `my_row` FROM `my_table` WHEN `datetime1` < `datetime2`
It's of course not problem if you compare two UNIX Timestamps which are stored as integers in the database:
SELECT `my_row` FROM `my_table` WHEN `int1` < `int2`
But what happens if you compare a DATETIME with a Timestamp (integer)?
SELECT `my_row` FROM `my_table` WHEN `datetime1` < UNIX_TIMESTAMP()
This is basically:
SELECT `my_row` FROM `my_table` WHEN `datetime1` < 1317750167
And it compares the "integered" DATETIME 20111004210710 for 2011-10-04 21:07:10 with 1317750167. This is obviously crap. Don't do it. Never. Instead you should convert your dates with UNIX_TIMESTAMP(your_datetime) or FROM_UNIXTIME(unix_timestamp).
Comparing MySQL types with PHP types ¶
The simplest way to compare MySQL DATE formats with PHP types is using strtotime(...) or date(...) if needed. If you have a DATETIME and you want to know if it's in the past, you can use
if (strtotime($datetime) < time()) {
echo '$datetime is in the past.';
}
From PHP to MySQL ¶
If you have a date you got via an date input field and want to submit it to MySQL, just use this piece of code:
$mysqlFormat = date('Y-m-d H:i:s', strtotime($_POST['my_date']));