Web Development

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;
}

About the author

Written by .

If you found this post useful you may also want to check these out:

  1. Calculating Difference Between Two Dates Using PHP
  2. Basic JavaScript Date and Time Functions
  3. JavaScript – Formatted Date, Back, Forward Buttons
  4. Displaying Current Date with JavaScript and Basic Math Calculations
  5. Linux vs. Windows web Hosting, does it make a difference?
  6. What is the difference between Unix and NT systems?
  • http://www.vailpromedia.com djmmts

    This is gorgeous. Thanks.

  • http://www.photography-basics.com Garry

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

  • Rajeev Sharma

    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/

  • http://bitmeta.org/ Akash Mehta

    @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.

  • ChaBi

    Did not work.

  • abhinav

    how to calculate the diffence between two dates stored in database mysql in the format yyyy-mm-dd (eg. 2008-09-12). date is stored in database in date datatype……
    wating for a sooner reply

  • Poly

    Did not work on this line:

    date(“j”, $dateto), date(“Y”, $datefrom)) 7)

    is this

    date(“j”, $dateto), date(“Y”, $datefrom))==7)

    or

    date(“j”, $dateto), date(“Y”, $datefrom)) < 7)

    thanks

  • Tom

    I’m getting the same problem as Poly. Any info on this?

  • http://www.galaxywebtech.com Chand

    function get_time_difference( $start, $end )
    {

    $uts['start'] =$start;
    $uts['end'] =$end;

    if( $uts['start']!=-1 && $uts['end']!=-1 )
    {
    if( $uts['end'] >= $uts['start'] )
    {
    $diff = $uts['end'] – $uts['start'];
    if( $days=intval((floor($diff/86400))) )
    $diff = $diff % 86400;
    if( $hours=intval((floor($diff/3600))) )
    $diff = $diff % 3600;
    if( $minutes=intval((floor($diff/60))) )
    $diff = $diff % 60;
    $diff = intval( $diff );
    return( array(‘days’=>$days, ‘hours’=>$hours, ‘minutes’=>$minutes, ‘seconds’=>$diff) );
    }
    else
    {
    return -2;
    //trigger_error( “Ending date/time is earlier than the start date/time”, E_USER_WARNING );
    }
    }
    else
    {
    return -3;
    //trigger_error( “Invalid date/time data detected”, E_USER_WARNING );
    }
    return( false );
    }

  • Ventzy

    Indeed there is something missing on “date(“j”, $dateto), date(“Y”, $datefrom)) 7)”.
    Does not work.

  • jeffery

    great …
    this would work for me…

    it saved me a lot of time….

    thanks for sharing such a good code…

  • John H

    This script is incomplete. The switch case for months references undefined variables required for the calculation.

  • Anonymous

    How do we use this? Example function call?