# Having big problems with date math.

``````  	  	  	  	    Having big problems with date math.  (very different from asp)
``````

I’m trying to get the difference in days between two dates. I have looked it up and tried it every way I can think of, and all it does is give me the difference between the day portions of the two dates. i.e.
It sees the difference between ‘10/15/1966’ and ‘7/21/2010’ as being 6. How do I get it to look at the whole date, and give me the total days?

I’ve used the following function to compare 2 dates worked really well:

[php]function datediff1(\$interval, \$datefrom, \$dateto, \$using_timestamps = false) {
/*
\$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is “1”, the first day. 2nd Feb 2003 is “33”. The datediff is “-32”.)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/

if (!\$using_timestamps) {
\$datefrom = strtotime(\$datefrom, 0);
\$dateto = strtotime(\$dateto, 0);
}

\$difference = \$dateto - \$datefrom; // Difference in seconds

switch(\$interval) {

case ‘yyyy’: // Number of full years

\$years_difference = floor(\$difference / 31536000);
if (mktime(date(“H”, \$datefrom), date(“i”, \$datefrom), date(“s”, \$datefrom), date(“n”, \$datefrom), date(“j”, \$datefrom), date(“Y”, \$datefrom)+\$years_difference) > \$dateto) {
\$years_difference–;
}
if (mktime(date(“H”, \$dateto), date(“i”, \$dateto), date(“s”, \$dateto), date(“n”, \$dateto), date(“j”, \$dateto), date(“Y”, \$dateto)-(\$years_difference+1)) > \$datefrom) {
\$years_difference++;
}

\$datediff = \$years_difference;
break;
case “q”: // Number of full quarters

\$quarters_difference = floor(\$difference / 8035200);
while (mktime(date(“H”, \$datefrom), date(“i”, \$datefrom), date(“s”, \$datefrom), date(“n”, \$datefrom)+(\$quarters_difference*3), date(“j”, \$dateto), date(“Y”, \$datefrom)) < \$dateto) {
\$months_difference++;
}

\$quarters_difference–;
\$datediff = \$quarters_difference;
break;
case “m”: // Number of full months

\$months_difference = floor(\$difference / 2678400);
while (mktime(date(“H”, \$datefrom), date(“i”, \$datefrom), date(“s”, \$datefrom), date(“n”, \$datefrom)+(\$months_difference), date(“j”, \$dateto), date(“Y”, \$datefrom)) < \$dateto) {
\$months_difference++;
}

\$months_difference–;
\$datediff = \$months_difference;
break;
case ‘y’: // Difference between day numbers

\$datediff = date(“z”, \$dateto) - date(“z”, \$datefrom);
break;
case “d”: // Number of full days

\$datediff = floor(\$difference / 86400);
break;
case “w”: // Number of full weekdays

\$days_difference = floor(\$difference / 86400);
\$weeks_difference = floor(\$days_difference / 7); // Complete weeks
\$first_day = date(“w”, \$datefrom);
\$days_remainder = floor(\$days_difference % 7);
\$odd_days = \$first_day + \$days_remainder; // Do we have a Saturday or Sunday in the remainder?
if (\$odd_days > 7) { // Sunday
\$days_remainder–;
}

if (\$odd_days > 6) { // Saturday
\$days_remainder–;
}

\$datediff = (\$weeks_difference * 5) + \$days_remainder;
break;
case “ww”: // Number of full weeks

\$datediff = floor(\$difference / 604800);
break;
case “h”: // Number of full hours

\$datediff = floor(\$difference / 3600);
break;
case “n”: // Number of full minutes

\$datediff = floor(\$difference / 60);
break;

default: // Number of full seconds (default)

\$datediff = \$difference;
break;
}

return \$datediff;

}[/php]

It’s a biggie, so use it call the function and pass in the interval the date from and date to and if datestamp is true or false.

depending on what you put on the interval will return different results:
[php]
echo datediff1(‘d’, “01-01-2010”, “01-01-2011”, false);[/php]
returns 365

Thanks, I’ll give it a try tonight, and let you know how it works…

It worked great… Thanks so much ;D