How to calculate the difference between two dates using PHP?
I have two dates of the form:
Start Date: 2007-03-24
End Date: 2009-06-26
Now I need to find the difference between these two in the following form:
2 years, 3 months and 2 days
How can I do this in PHP?
The best course of action is using PHP's DateTime
(and DateInterval
) objects. Each date is encapsulated in a DateTime
object, and then a difference between the two can be made:
$first_date = new DateTime("2012-11-30 17:03:30");
$second_date = new DateTime("2012-12-21 00:00:00");
The DateTime
object will accept any format strtotime()
would. If an even more specific date format is needed, DateTime::createFromFormat()
can be used to create the DateTime
object.
After both objects were instantiated, you substract one from the other with DateTime::diff()
.
$difference = $first_date->diff($second_date);
$difference
now holds a DateInterval
object with the difference information. A var_dump()
looks like this:
object(DateInterval)
public 'y' => int 0
public 'm' => int 0
public 'd' => int 20
public 'h' => int 6
public 'i' => int 56
public 's' => int 30
public 'invert' => int 0
public 'days' => int 20
To format the DateInterval
object, we'll need check each value and exclude it if it's 0:
/**
* Format an interval to show all existing components.
* If the interval doesn't have a time component (years, months, etc)
* That component won't be displayed.
*
* @param DateInterval $interval The interval
*
* @return string Formatted interval string.
*/
function format_interval(DateInterval $interval) {
$result = "";
if ($interval->y) { $result .= $interval->format("%y years "); }
if ($interval->m) { $result .= $interval->format("%m months "); }
if ($interval->d) { $result .= $interval->format("%d days "); }
if ($interval->h) { $result .= $interval->format("%h hours "); }
if ($interval->i) { $result .= $interval->format("%i minutes "); }
if ($interval->s) { $result .= $interval->format("%s seconds "); }
return $result;
}
All that's left now is to call our function on the $difference
DateInterval
object:
echo format_interval($difference);
And we get the correct result:
20 days 6 hours 56 minutes 30 seconds
The complete code used to achieve the goal:
/**
* Format an interval to show all existing components.
* If the interval doesn't have a time component (years, months, etc)
* That component won't be displayed.
*
* @param DateInterval $interval The interval
*
* @return string Formatted interval string.
*/
function format_interval(DateInterval $interval) {
$result = "";
if ($interval->y) { $result .= $interval->format("%y years "); }
if ($interval->m) { $result .= $interval->format("%m months "); }
if ($interval->d) { $result .= $interval->format("%d days "); }
if ($interval->h) { $result .= $interval->format("%h hours "); }
if ($interval->i) { $result .= $interval->format("%i minutes "); }
if ($interval->s) { $result .= $interval->format("%s seconds "); }
return $result;
}
$first_date = new DateTime("2012-11-30 17:03:30");
$second_date = new DateTime("2012-12-21 00:00:00");
$difference = $first_date->diff($second_date);
echo format_interval($difference);
链接地址: http://www.djcxy.com/p/9838.html
下一篇: 如何计算使用PHP的两个日期之间的差异?