SoFunction
Updated on 2025-03-02

Share the code for PHP to calculate the number of days between two dates

This article example describes the method of php calculating the number of days difference between two dates. Share it for your reference. The specific implementation method is as follows:

<?php
$date1 = date( 'Y-m-d' );
$date2 = "2015-12-04";
$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);
-------------------------------------------------------- OR
$date1 = new DateTime("2007-03-24");
$date2 = new DateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; 
// shows the total amount of days (not divided into years, months and days like above)
echo "difference " . $interval->days . " days ";
-------------------------------------------------------- OR  
  
/**
 * 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.
*/
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 = "2014-12-04 19:37:22";
echo '<pre>';
print_r( _date_diff( strtotime($date), time() ) );
echo '</pre>'; 
?>

I hope this article will be helpful for everyone to learn PHP programming.