﻿ How to Calculate the Difference Between Two Dates Using PHP - ITCodar

# How to Calculate the Difference Between Two Dates Using PHP

## How to calculate the difference between two dates using PHP?

Use this for legacy code (PHP < 5.3). For up to date solution see jurka's answer below

You can use strtotime() to convert two dates to unix time and then calculate the number of seconds between them. From this it's rather easy to calculate different time periods.

``\$date1 = "2007-03-24";\$date2 = "2009-06-26";\$diff = abs(strtotime(\$date2) - strtotime(\$date1));\$years = floor(\$diff / (365*60*60*24));\$months = floor((\$diff - \$years * 365*60*60*24) / (30*60*60*24));\$days = floor((\$diff - \$years * 365*60*60*24 - \$months*30*60*60*24)/ (60*60*24));printf("%d years, %d months, %d days\n", \$years, \$months, \$days);``

Edit: Obviously the preferred way of doing this is like described by jurka below. My code is generally only recommended if you don't have PHP 5.3 or better.

Several people in the comments have pointed out that the code above is only an approximation. I still believe that for most purposes that's fine, since the usage of a range is more to provide a sense of how much time has passed or remains rather than to provide precision - if you want to do that, just output the date.

Despite all that, I've decided to address the complaints. If you truly need an exact range but haven't got access to PHP 5.3, use the code below (it should work in PHP 4 as well). This is a direct port of the code that PHP uses internally to calculate ranges, with the exception that it doesn't take daylight savings time into account. That means that it's off by an hour at most, but except for that it should be correct.

``<?php/** * Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff() * implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved. *  * See here for original code: * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup */function _date_range_limit(\$start, \$end, \$adj, \$a, \$b, \$result){    if (\$result[\$a] < \$start) {        \$result[\$b] -= intval((\$start - \$result[\$a] - 1) / \$adj) + 1;        \$result[\$a] += \$adj * intval((\$start - \$result[\$a] - 1) / \$adj + 1);    }    if (\$result[\$a] >= \$end) {        \$result[\$b] += intval(\$result[\$a] / \$adj);        \$result[\$a] -= \$adj * intval(\$result[\$a] / \$adj);    }    return \$result;}function _date_range_limit_days(\$base, \$result){    \$days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);    \$days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);    _date_range_limit(1, 13, 12, "m", "y", &\$base);    \$year = \$base["y"];    \$month = \$base["m"];    if (!\$result["invert"]) {        while (\$result["d"] < 0) {            \$month--;            if (\$month < 1) {                \$month += 12;                \$year--;            }            \$leapyear = \$year % 400 == 0 || (\$year % 100 != 0 && \$year % 4 == 0);            \$days = \$leapyear ? \$days_in_month_leap[\$month] : \$days_in_month[\$month];            \$result["d"] += \$days;            \$result["m"]--;        }    } else {        while (\$result["d"] < 0) {            \$leapyear = \$year % 400 == 0 || (\$year % 100 != 0 && \$year % 4 == 0);            \$days = \$leapyear ? \$days_in_month_leap[\$month] : \$days_in_month[\$month];            \$result["d"] += \$days;            \$result["m"]--;            \$month++;            if (\$month > 12) {                \$month -= 12;                \$year++;            }        }    }    return \$result;}function _date_normalize(\$base, \$result){    \$result = _date_range_limit(0, 60, 60, "s", "i", \$result);    \$result = _date_range_limit(0, 60, 60, "i", "h", \$result);    \$result = _date_range_limit(0, 24, 24, "h", "d", \$result);    \$result = _date_range_limit(0, 12, 12, "m", "y", \$result);    \$result = _date_range_limit_days(&\$base, &\$result);    \$result = _date_range_limit(0, 12, 12, "m", "y", \$result);    return \$result;}/** * Accepts two unix timestamps. */function _date_diff(\$one, \$two){    \$invert = false;    if (\$one > \$two) {        list(\$one, \$two) = array(\$two, \$one);        \$invert = true;    }    \$key = array("y", "m", "d", "h", "i", "s");    \$a = array_combine(\$key, array_map("intval", explode(" ", date("Y m d H i s", \$one))));    \$b = array_combine(\$key, array_map("intval", explode(" ", date("Y m d H i s", \$two))));    \$result = array();    \$result["y"] = \$b["y"] - \$a["y"];    \$result["m"] = \$b["m"] - \$a["m"];    \$result["d"] = \$b["d"] - \$a["d"];    \$result["h"] = \$b["h"] - \$a["h"];    \$result["i"] = \$b["i"] - \$a["i"];    \$result["s"] = \$b["s"] - \$a["s"];    \$result["invert"] = \$invert ? 1 : 0;    \$result["days"] = intval(abs((\$one - \$two)/86400));    if (\$invert) {        _date_normalize(&\$a, &\$result);    } else {        _date_normalize(&\$b, &\$result);    }    return \$result;}\$date = "1986-11-10 19:37:22";print_r(_date_diff(strtotime(\$date), time()));print_r(_date_diff(time(), strtotime(\$date)));``

## Finding the number of days between two dates

``\$now = time(); // or your date as well\$your_date = strtotime("2010-01-31");\$datediff = \$now - \$your_date;echo round(\$datediff / (60 * 60 * 24));``

## Calculate the difference between two dates in PHP?

A date difference by itself can only be precise to the Day. If you go up to the months and years, then the results will be inevitably false without a date reference.

You can say

9 years, 2 months, 29days till X date

and the reference would be today.

If you take the same period(Year, month, day), and use the date 2019-03-01 as reference, you would have the wrong result.

Here is an example:

``\$objDatetimeSource1 = new DateTime('2010-04-01');\$objDatetimeSource2 = new DateTime('2019-06-30');\$interval =  \$objDatetimeSource1->diff(\$objDatetimeSource2);\$objDatetime1 = new DateTime('2020-02-28');\$objDatetime2 = new DateTime('2020-03-01');``

`\$objDatetime1->add(\$interval);` will give `2029-05-27 00:00:00` and

`\$objDatetime1->add(\$interval);` will give `2029-05-30 00:00:00` with 3 days difference between them, when, from the dates `2020-02-28` and `2020-03-01`, you can clearly see that there is only 2 days difference.

## Date Difference in php on days?

strtotime will convert your date string to a unix time stamp. (seconds since the unix epoch.

``\$ts1 = strtotime(\$date1);\$ts2 = strtotime(\$date2);\$seconds_diff = \$ts2 - \$ts1;``

## How to get time difference in minutes in PHP

Subtract the past most one from the future most one and divide by 60.

Times are done in Unix format so they're just a big number showing the number of seconds from `January 1, 1970, 00:00:00 GMT`

## Find difference between two datetimes and format at Y-m-d H:i:s

I'm not sure what format you're looking for in your difference but here's how to do it using DateTime

``\$datetime1 = new DateTime();\$datetime2 = new DateTime('2011-01-03 17:13:00');\$interval = \$datetime1->diff(\$datetime2);\$elapsed = \$interval->format('%y years %m months %a days %h hours %i minutes %s seconds');echo \$elapsed;``

## How to calculate the difference between two dates with time using PHP?

Now I need to find the difference between these two in the following form:

`0 years, 0 months, 7 days, 22 hours, 44 mints, 35 sec`

So that’s your main problem here, getting this exact output structure?

Well then you simply have to format the DateInterval differently:

``echo \$dteDiff->format("%y years, %m months, %d days, %h hours, %i mints, %s sec");``

## How to calculate the difference between 2 dates properly php

This should calculate the difference correctly.

``function monthDiff(\$m1, \$m2) {    if(\$m1 > \$m2) {        return 12 - \$m1 + \$m2;    }    return \$m2 - \$m1;}function yearDiff(\$y1, \$y2) {    return \$y2 - \$y1;}function checkLeapYear(\$year){    \$year = (int)\$year;    return ( ( (\$year % 4 == 0 && (\$year % 100) != 0 ) || ( (\$year % 100) == 0 && (\$year % 400) == 0 ) ) ? 1 : 0);}function dateDiff(\$date1, \$date2 = false) {    if (!\$date2)        \$date2 = date('Y-m-d');    \$datetime1 = new DateTime(\$date1 , new DateTimeZone('EUROPE/Sofia'));    \$datetime2 = new DateTime(\$date2 , new DateTimeZone('EUROPE/Sofia'));    if(\$datetime1 > \$datetime2){ //always go from smaller to bigger date        \$temp = \$datetime1;        \$datetime1 = \$datetime2;        \$datetime2 = \$temp;     }    \$d1 = (int)\$datetime1->format('d');    \$d2 = (int)\$datetime2->format('d');    \$m1 = (int)\$datetime1->format('m');    \$m2 = (int)\$datetime2->format('m');    \$y1 = (int)\$datetime1->format('Y');    \$y2 = (int)\$datetime2->format('Y');    \$leapYear = checkLeapYear(\$y1);     \$daysInMonth1 = [1 => 31, 28 + \$leapYear, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // the number of days in the months    \$leapYear = checkLeapYear(\$y2);    \$daysInMonth2 = [1 => 31, 28 + \$leapYear, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];    \$monthCorrection = 0;    if (\$d1 < \$d2) {        \$d = \$d2 - \$d1;     }    if (\$d1 > \$d2){        if (\$daysInMonth2[\$m2] >= \$d1){             \$d = \$daysInMonth1[\$m1] - \$d1 + \$d2;;        }        else {            \$d = \$daysInMonth1[\$m1] - \$d1 + \$d2;        }        \$monthCorrection = -1;    }    if (\$d1 == \$d2 ){        \$d = 0;    }    \$m = monthDiff(\$m1, \$m2) + \$monthCorrection;    \$y = yearDiff(\$y1, \$y2);    if (\$m1 > \$m2){        \$y--;    }    return \$y . " years " . \$m . " months " . \$d . " days";}``

## How to calculate difference of two string dates in days using PHP?

Try this, use date_create

``\$dnow = "2016-12-1";\$dafter = "2016-12-11";\$date1=date_create(\$dnow);\$date2=date_create(\$dafter);\$diff=date_diff(\$date1,\$date2);print_r(\$diff);``

DEMO

## How to calculate the number of days (difference) between two dates in PHP?

``\$start = strtotime('2015-03-13');\$end = strtotime('2015-03-20');\$diff = \$end - \$start;\$days = floor(\$diff / (3600 * 24));``