Helping ordinary people create extraordinary websites!
GET OUR NEWSLETTER
Your Email:
 
Webmaster Blog

Calculating date difference more precisely in PHP

Following this post by Akash Mehta, I thought that a precise dateDiff() function might be helpful for many of you. The following function calculates the difference of two dates in “day” or “month” or “year” more precisely. This function is production ready and you can use it in any of your application which mainly works with these date difference. I have found it somewhere in web, just forgot the source. Thanks to the unknown author of this excellent function.

function datediff($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))  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;
}


Related Posts
» Give Your Visitors a Relative Time
» Building Web 2.0 Tag Clouds in PHP
» RSS feeds in PHP: 3 simple steps to PHP RSS generation
» Converting your traffic into customers
» Yahoo! UI File Uploader Library
 



8 Responses to “Calculating date difference more precisely in PHP”

  1. Give Your Visitors a Relative Time Says:

    […] Hasin Hayder, a fellow DT blogger, wrote a post about a similar function that you may be interested in. Bookmark It Hide […]

  2. Developer Tutorials Blog: Calculating date difference more precisely in PHP | Cole Design Studios Says:

    […] Hayder has posted his own response to a recent “relative time” article (showing users things like “received 2 days […]

  3. The Back Burner » Downright Slippery Time Says:

    […] resistance to DST, but could be useful in some situations. Ironically, the post he links to about calculating date difference more precisely in PHP (also untested) looks as if it does not take this problem into account. Go […]

  4. djmmts Says:

    This is gorgeous. Thanks.

  5. Garry Says:

    is this function complete, what about the other intervals in the switch statement?

  6. Rajeev Sharma Says:

    Akash I’m so pleased to read that you acknowledge and thanked the author of this function and made it available for others to be benefited.

    There exist thankless creatures who claim others work. :-)

    This function was written by and available at:
    http://www.ilovejackdaniels.com/php/php-datediff-function/

  7. Akash Mehta Says:

    @Rajeev: Thanks for the heads up. Actually, Hasin Hyder wrote this post, he was merely following on from a similar post I made on “relative time” (see http://www.developertutorials.com/blog/php/give-your-visitors-relative-y-php-69/). He will probably link the original post now that you have pointed it out, but I’ll leave it up to him; the comments on that post are quite useful as well.

  8. ChaBi Says:

    Did not work.

Leave a Reply

Advertise with Us!


Blog Categories Blog Archives


Tutorials Scripts Web Hosting Developer Manuals
Resources