【问题标题】:How to calculate the difference between two dates using PHP?如何使用 PHP 计算两个日期之间的差异?
【发布时间】:2010-10-15 04:16:50
【问题描述】:

我有两个日期的表格:

Start Date: 2007-03-24 
End Date: 2009-06-26

现在我需要用下面的形式找出这两者之间的区别:

2 years, 3 months and 2 days

我如何在 PHP 中做到这一点?

【问题讨论】:

标签: php datetime datediff


【解决方案1】:

使用这个功能

//function Diff between Dates
//////////////////////////////////////////////////////////////////////
//PARA: Date Should In YYYY-MM-DD Format
//RESULT FORMAT:
// '%y Year %m Month %d Day %h Hours %i Minute %s Seconds' =>  1 Year 3 Month 14 Day 11 Hours 49 Minute 36 Seconds
// '%y Year %m Month %d Day'                       =>  1 Year 3 Month 14 Days
// '%m Month %d Day'                                     =>  3 Month 14 Day
// '%d Day %h Hours'                                   =>  14 Day 11 Hours
// '%d Day'                                                 =>  14 Days
// '%h Hours %i Minute %s Seconds'         =>  11 Hours 49 Minute 36 Seconds
// '%i Minute %s Seconds'                           =>  49 Minute 36 Seconds
// '%h Hours                                          =>  11 Hours
// '%a Days                                                =>  468 Days
//////////////////////////////////////////////////////////////////////
function dateDifference($date_1 , $date_2 , $differenceFormat = '%a' )
{
    $datetime1 = date_create($date_1);
    $datetime2 = date_create($date_2);

    $interval = date_diff($datetime1, $datetime2);

    return $interval->format($differenceFormat);

}

只设置参数$differenceFormat根据你的需要 例如,我希望您的年龄与月份和天数之间的差异

dateDifference(date('Ym-d') , $date , '%y %m %d')

或其他格式

dateDifference(date('Ym-d') , $date , '%y-%m-%d')

【讨论】:

    【解决方案2】:

    我想提出一个稍微不同的观点,这似乎没有被提及。

    您可以以声明的方式解决这个问题(就像任何其他问题一样)。重点是问什么你需要,而不是如何到达那里。

    在这里,您需要与众不同。但那有什么区别呢?正如最受欢迎的答案中已经提到的那样,这是一个间隔。问题是如何得到它。无需显式调用diff() 方法,您只需按开始日期和结束日期(即按日期范围)创建一个间隔:

    $startDate = '2007-03-24';
    $endDate = '2009-06-26';
    $range = new FromRange(new ISO8601DateTime($startDate), new ISO8601DateTime($endDate));
    

    诸如闰年之类的所有复杂问题都已经处理好了。现在,当您有一个固定开始日期时间的间隔时,您可以获得一个人类可读的版本:

    var_dump((new HumanReadable($range))->value());
    

    它准确地输出你需要的东西。

    如果您需要一些自定义格式,这也不是问题。您可以使用ISO8601Formatted 类,该类接受带有六个参数的可调用对象:年、月、日、小时、分钟和秒:

    (new ISO8601Formatted(
        new FromRange(
            new ISO8601DateTime('2017-07-03T14:27:39+00:00'),
            new ISO8601DateTime('2018-07-05T14:27:39.235487+00:00')
        ),
        function (int $years, int $months, int $days, int $hours, int $minutes, int $seconds) {
            return $years >= 1 ? 'More than a year' : 'Less than a year';
        }
    ))
        ->value();
    

    它输出More than a year

    有关此方法的更多信息,请查看quick start entry

    【讨论】:

      【解决方案3】:

      将此用于遗留代码 (PHP

      您可以使用 strtotime() 将两个日期转换为 unix 时间,然后计算它们之间的秒数。由此很容易计算出不同的时间段。

      $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);
      

      编辑: 显然,这样做的首选方式如下 jurka 所述。我的代码通常仅在您没有 PHP 5.3 或更高版本时才推荐使用。

      cmets 中的一些人指出,上面的代码只是一个近似值。我仍然相信对于大多数目的来说这很好,因为范围的使用更多地是为了提供已经过去或剩余多少时间的感觉,而不是提供精确度 - 如果你想这样做,只需输出日期。

      尽管如此,我还是决定解决这些投诉。如果您确实需要一个确切的范围但无法访问 PHP 5.3,请使用下面的代码(它也应该在 PHP 4 中工作)。这是 PHP 在内部用于计算范围的代码的直接端口,但它不考虑夏令时。这意味着它最多关闭一个小时,但除此之外它应该是正确的。

      <?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)));
      

      【讨论】:

      • 如果你使用的是 DateTime 类,你可以使用 $date->format('U') 来获取 unix 时间戳。
      • 如果您必须处理夏季/冬季时间,这不是真的。在这种特殊情况下,当您调整夏季/冬季时间时,一天等于 23 或 25 小时。
      • 嗯,闰年也可以这样。它也没有考虑到这一点。不过,我不相信你甚至想考虑到这一点,因为我们在这里讨论了一个范围。范围的语义与绝对日期的语义有些不同。
      • 这个函数不正确。它适用于近似值,但不适用于精确范围。一方面,它假设一个月有 30 天,也就是说,2 月 1 日和 3 月 1 日之间的天数差异与 7 月 1 日至 8 月 1 日的天数差异相同(无论闰年如何)。
      • 在 PHP 中,引用变量在函数签名中,而不是在调用中。将您所有的 &amp; 移至签名处。
      【解决方案4】:

      使用date_diff() 尝试这个非常简单的答案,这是经过测试的。

      $date1 = date_create("2017-11-27");
      $date2 = date_create("2018-12-29");
      $diff=date_diff($date1,$date2);
      $months = $diff->format("%m months");
      $years = $diff->format("%y years");
      $days = $diff->format("%d days");
      
      echo $years .' '.$months.' '.$days;
      

      输出是:

      1 years 1 months 2 days
      

      【讨论】:

        【解决方案5】:

        这是可运行的代码

        $date1 = date_create('2007-03-24');
        $date2 = date_create('2009-06-26');
        $diff1 = date_diff($date1,$date2);
        $daysdiff = $diff1->format("%R%a");
        $daysdiff = abs($daysdiff);
        

        【讨论】:

          【解决方案6】:

          一个简单的函数

          function time_difference($time_1, $time_2, $limit = null)
          {
          
              $val_1 = new DateTime($time_1);
              $val_2 = new DateTime($time_2);
          
              $interval = $val_1->diff($val_2);
          
              $output = array(
                  "year" => $interval->y,
                  "month" => $interval->m,
                  "day" => $interval->d,
                  "hour" => $interval->h,
                  "minute" => $interval->i,
                  "second" => $interval->s
              );
          
              $return = "";
              foreach ($output AS $key => $value) {
          
                  if ($value == 1)
                      $return .= $value . " " . $key . " ";
                  elseif ($value >= 1)
                      $return .= $value . " " . $key . "s ";
          
                  if ($key == $limit)
                      return trim($return);
              }
              return trim($return);
          }
          

          使用喜欢

          echo time_difference ($time_1, $time_2, "day");

          会像2 years 8 months 2 days一样返回

          【讨论】:

            【解决方案7】:

            我更喜欢使用 date_createdate_diff 对象。

            代码:

            $date1 = date_create("2007-03-24");
            $date2 = date_create("2009-06-26");
            
            $dateDifference = date_diff($date1, $date2)->format('%y years, %m months and %d days');
            
            echo $dateDifference;
            

            输出:

            2 years, 3 months and 2 days
            

            更多信息请阅读PHP date_diff manual

            根据手册date_diff是一个别名 DateTime::diff()

            【讨论】:

              【解决方案8】:
              $date = '2012.11.13';
              $dateOfReturn = '2017.10.31';
              
              $substract = str_replace('.', '-', $date);
              
              $substract2 = str_replace('.', '-', $dateOfReturn);
              
              
              
              $date1 = $substract;
              $date2 = $substract2;
              
              $ts1 = strtotime($date1);
              $ts2 = strtotime($date2);
              
              $year1 = date('Y', $ts1);
              $year2 = date('Y', $ts2);
              
              $month1 = date('m', $ts1);
              $month2 = date('m', $ts2);
              
              echo $diff = (($year2 - $year1) * 12) + ($month2 - $month1);
              

              【讨论】:

                【解决方案9】:

                对于 php 版本 >=5.3 :创建两个日期对象,然后使用 date_diff() 函数。它将返回 php DateInterval 对象。 see documentation

                $date1=date_create("2007-03-24");
                $date2=date_create("2009-06-26");
                $diff=date_diff($date1,$date2);
                echo $diff->format("%R%a days");
                

                【讨论】:

                  【解决方案10】:

                  你总是可以使用下面的函数,它可以返回以年和月为单位的年龄(即1年4个月)

                  function getAge($dob, $age_at_date)
                  {  
                      $d1 = new DateTime($dob);
                      $d2 = new DateTime($age_at_date);
                      $age = $d2->diff($d1);
                      $years = $age->y;
                      $months = $age->m;
                  
                      return $years.'.'.months;
                  }
                  

                  或者如果你想在当前日期计算年龄,你可以使用

                  function getAge($dob)
                  {  
                      $d1 = new DateTime($dob);
                      $d2 = new DateTime(date());
                      $age = $d2->diff($d1);
                      $years = $age->y;
                      $months = $age->m;
                  
                      return $years.'.'.months;
                  }
                  

                  【讨论】:

                    【解决方案11】:

                    我建议使用 DateTime 和 DateInterval 对象。

                    $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 ";
                    

                    阅读更多php DateTime::diff manual

                    来自手册:

                    从 PHP 5.2.2 开始,可以使用比较运算符来比较 DateTime 对象。

                    $date1 = new DateTime("now");
                    $date2 = new DateTime("tomorrow");
                    
                    var_dump($date1 == $date2); // bool(false)
                    var_dump($date1 < $date2);  // bool(true)
                    var_dump($date1 > $date2);  // bool(false)
                    

                    【讨论】:

                    • +1 DateTime 可以正确处理闰年和时区,而且书架上有一本好书:phparch.com/books/…
                    • 有没有一种方法可以给出两个日期时间之间的总秒数? (不加组件,即)
                    • @Panique $interval->days 和 $interval->d 是不同的度量。您上面的评论是正确的“显示总天数(不像上面那样分为年,月和日)”
                    • @potatoe 你可能想要$date2-&gt;format('U') - $date1-&gt;format('U')
                    • 请注意,在某些 PHP 版本的 Windows 上,DateInterval 的天数属性(始终为 6015)存在一个错误:bugs.php.net/bug.php?id=51184(请参阅那里的 cmets 以获取修复/解决方法)
                    【解决方案12】:

                    很简单:

                        <?php
                            $date1 = date_create("2007-03-24");
                            echo "Start date: ".$date1->format("Y-m-d")."<br>";
                            $date2 = date_create("2009-06-26");
                            echo "End date: ".$date2->format("Y-m-d")."<br>";
                            $diff = date_diff($date1,$date2);
                            echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";
                        ?>
                    

                    详情请查看以下链接:

                    PHP: date_diff - Manual

                    请注意,它适用于 PHP 5.3.0 或更高版本。

                    【讨论】:

                      【解决方案13】:

                      对此我有一些简单的逻辑:

                      <?php
                          per_days_diff('2011-12-12','2011-12-29')
                          function per_days_diff($start_date, $end_date) {
                              $per_days = 0;
                              $noOfWeek = 0;
                              $noOfWeekEnd = 0;
                              $highSeason=array("7", "8");
                      
                              $current_date = strtotime($start_date);
                              $current_date += (24 * 3600);
                              $end_date = strtotime($end_date);
                      
                              $seassion = (in_array(date('m', $current_date), $highSeason))?"2":"1";
                      
                              $noOfdays = array('');
                      
                              while ($current_date <= $end_date) {
                                  if ($current_date <= $end_date) {
                                      $date = date('N', $current_date);
                                      array_push($noOfdays,$date);
                                      $current_date = strtotime('+1 day', $current_date);
                                  }
                              }
                      
                              $finalDays = array_shift($noOfdays);
                              //print_r($noOfdays);
                              $weekFirst = array("week"=>array(),"weekEnd"=>array());
                              for($i = 0; $i < count($noOfdays); $i++)
                              {
                                  if ($noOfdays[$i] == 1)
                                  {
                                      //echo "This is week";
                                      //echo "<br/>";
                                      if($noOfdays[$i+6]==7)
                                      {
                                          $noOfWeek++;
                                          $i=$i+6;
                                      }
                                      else
                                      {
                                          $per_days++;
                                      }
                                      //array_push($weekFirst["week"],$day);
                                  }
                                  else if($noOfdays[$i]==5)
                                  {
                                      //echo "This is weekend";
                                      //echo "<br/>";
                                      if($noOfdays[$i+2] ==7)
                                      {
                                          $noOfWeekEnd++;
                                          $i = $i+2;
                                      }
                                      else
                                      {
                                          $per_days++;
                                      }
                                      //echo "After weekend value:- ".$i;
                                      //echo "<br/>";
                                  }
                                  else
                                  {
                                      $per_days++;
                                  }
                              }
                      
                              /*echo $noOfWeek;
                                echo "<br/>";
                                echo $noOfWeekEnd;
                                echo "<br/>";
                                print_r($per_days);
                                echo "<br/>";
                                print_r($weekFirst);
                              */
                      
                              $duration = array("weeks"=>$noOfWeek, "weekends"=>$noOfWeekEnd, "perDay"=>$per_days, "seassion"=>$seassion);
                              return $duration;
                            ?>
                      

                      【讨论】:

                      • 示例代码的末尾似乎缺少一些东西(结束大括号和“?>”?)。
                      • “简单”逻辑。这些至少是 40 行纯代码。
                      【解决方案14】:

                      前段时间我写了一个format_date 函数,因为它提供了许多关于你想要约会方式的选项

                      function format_date($date, $type, $seperator="-")
                      {
                          if($date)
                          {
                              $day = date("j", strtotime($date));
                              $month = date("n", strtotime($date));
                              $year = date("Y", strtotime($date));
                              $hour = date("H", strtotime($date));
                              $min = date("i", strtotime($date));
                              $sec = date("s", strtotime($date));
                      
                              switch($type)
                              {
                                  case 0:  $date = date("Y".$seperator."m".$seperator."d",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 1:  $date = date("D, F j, Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 2:  $date = date("d".$seperator."m".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 3:  $date = date("d".$seperator."M".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 4:  $date = date("d".$seperator."M".$seperator."Y h:i A",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 5:  $date = date("m".$seperator."d".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 6:  $date = date("M",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 7:  $date = date("Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 8:  $date = date("j",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 9:  $date = date("n",mktime($hour, $min, $sec, $month, $day, $year)); break;
                                  case 10: 
                                           $diff = abs(strtotime($date) - strtotime(date("Y-m-d h:i:s"))); 
                                           $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));
                                           $date = $years . " years, " . $months . " months, " . $days . "days";
                              }
                          }
                          return($date);
                      }    
                      

                      【讨论】:

                      • 这个答案和 khaldonno 的答案一样错误。它假设(案例 10)一年有 365 天(每四年有 366 天(公历的 100 年 / 400 年规则除外)),并且一个月有 30 天(大约是 30.42 天在非闰年)。即使有更好的常数,它也只是平均正确,不一定对任何两个特定日期都是正确的。
                      【解决方案15】:

                      看看下面的链接。这是迄今为止我找到的最佳答案.. :)

                      function dateDiff ($d1, $d2) {
                      
                          // Return the number of days between the two dates:    
                          return round(abs(strtotime($d1) - strtotime($d2))/86400);
                      
                      } // end function dateDiff
                      

                      无论您在哪个日期更早或更晚 日期参数。该函数使用 PHP ABS() 绝对值 总是返回一个正数作为两者之间的天数 日期。

                      请记住,两个日期之间的天数不是 包括两个日期。所以如果你正在寻找天数 由输入日期之间(包括输入日期)之间的所有日期表示, 您需要在此函数的结果中添加一 (1)。

                      例如,差异(由上述函数返回) 在 2013-02-09 和 2013-02-14 之间是 5。但是天数还是 日期范围 2013-02-09 - 2013-02-14 表示的日期为 6。

                      http://www.bizinfosys.com/php/date-difference.html

                      【讨论】:

                      • 问题要求的差异是年数、月数和天数,而不是总天数。
                      • 很棒的人,为我在几天内得到了差异,谢谢
                      【解决方案16】:
                      <?php
                          $today = strtotime("2011-02-03 00:00:00");
                          $myBirthDate = strtotime("1964-10-30 00:00:00");
                          printf("Days since my birthday: ", ($today - $myBirthDate)/60/60/24);
                      ?>
                      

                      【讨论】:

                      • 问题要求的差异是。这会将差异输出为总天数。
                      【解决方案17】:

                      我在下一页找到了您的文章,其中包含许多关于 PHP 日期时间计算的参考资料。

                      使用 PHP 计算两个日期(和时间)之间的差异。以下页面提供了一系列不同的方法(总共 7 种)用于使用 PHP 执行日期/时间计算,以确定两个日期之间的时间(小时、分钟)、天、月或年的差异。

                      PHP Date Time – 7 Methods to Calculate the Difference between 2 dates

                      【讨论】:

                        【解决方案18】:

                        “如果”日期存储在MySQL中,我发现在数据库级别进行差异计算更容易......然后根据Day,Hour,Min,Sec输出,适当地解析和显示结果.. .

                        mysql> select firstName, convert_tz(loginDate, '+00:00', '-04:00') as loginDate, TIMESTAMPDIFF(DAY, loginDate, now()) as 'Day', TIMESTAMPDIFF(HOUR, loginDate, now())+4 as 'Hour', TIMESTAMPDIFF(MINUTE, loginDate, now())+(60*4) as 'Min', TIMESTAMPDIFF(SECOND, loginDate, now())+(60*60*4) as 'Sec' from User_ where userId != '10158' AND userId != '10198' group by emailAddress order by loginDate desc;
                         +-----------+---------------------+------+------+------+--------+
                         | firstName | loginDate           | Day  | Hour | Min  | Sec    |
                         +-----------+---------------------+------+------+------+--------+
                         | Peter     | 2014-03-30 18:54:40 |    0 |    4 |  244 |  14644 |
                         | Keith     | 2014-03-30 18:54:11 |    0 |    4 |  244 |  14673 |
                         | Andres    | 2014-03-28 09:20:10 |    2 |   61 | 3698 | 221914 |
                         | Nadeem    | 2014-03-26 09:33:43 |    4 |  109 | 6565 | 393901 |
                         +-----------+---------------------+------+------+------+--------+
                         4 rows in set (0.00 sec)
                        

                        【讨论】:

                          【解决方案19】:

                          由于每个人都在发布代码示例,这里是另一个版本。

                          我想要一个函数来显示从秒到年的差异(只有一个单位)。对于超过 1 天的时间段,我希望它在午夜翻转(从周三上午 9 点看到的周一上午 10 点是 2 天前,而不是 1 天)。对于超过一个月的时间段,我希望翻转在当月的同一天(包括 30/31 天的月份和闰年)。

                          这是我想出的:

                          /**
                           * Returns how long ago something happened in the past, showing it
                           * as n seconds / minutes / hours / days / weeks / months / years ago.
                           *
                           * For periods over a day, it rolls over at midnight (so doesn't depend
                           * on current time of day), and it correctly accounts for month-lengths
                           * and leap-years (months and years rollover on current day of month).
                           *
                           * $param string $timestamp in DateTime format
                           * $return string description of interval
                           */
                          function ago($timestamp)
                          {
                              $then = date_create($timestamp);
                          
                              // for anything over 1 day, make it rollover on midnight
                              $today = date_create('tomorrow'); // ie end of today
                              $diff = date_diff($then, $today);
                          
                              if ($diff->y > 0) return $diff->y.' year'.($diff->y>1?'s':'').' ago';
                              if ($diff->m > 0) return $diff->m.' month'.($diff->m>1?'s':'').' ago';
                              $diffW = floor($diff->d / 7);
                              if ($diffW > 0) return $diffW.' week'.($diffW>1?'s':'').' ago';
                              if ($diff->d > 1) return $diff->d.' day'.($diff->d>1?'s':'').' ago';
                          
                              // for anything less than 1 day, base it off 'now'
                              $now = date_create();
                              $diff = date_diff($then, $now);
                          
                              if ($diff->d > 0) return 'yesterday';
                              if ($diff->h > 0) return $diff->h.' hour'.($diff->h>1?'s':'').' ago';
                              if ($diff->i > 0) return $diff->i.' minute'.($diff->i>1?'s':'').' ago';
                              return $diff->s.' second'.($diff->s==1?'':'s').' ago';
                          }
                          

                          【讨论】:

                            【解决方案20】:

                            我在 PHP 5.2 中遇到了同样的问题,并用 MySQL 解决了它。可能不是您正在寻找的内容,但这可以解决问题并返回天数:

                            $datediff_q = $dbh->prepare("SELECT DATEDIFF(:date2, :date1)");
                            $datediff_q->bindValue(':date1', '2007-03-24', PDO::PARAM_STR);
                            $datediff_q->bindValue(':date2', '2009-06-26', PDO::PARAM_STR);
                            $datediff = ($datediff_q->execute()) ? $datediff_q->fetchColumn(0) : false;
                            

                            更多信息在这里http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

                            【讨论】:

                              【解决方案21】:

                              这将尝试检测是否给出了时间戳,并将返回未来的日期/时间作为负值:

                              <?php
                              
                              function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE) {
                                // If $convert_to_timestamp is not explicitly set to TRUE,
                                // check to see if it was accidental:
                                if ($convert_to_timestamp || !is_numeric($start)) {
                                  // If $convert_to_timestamp is TRUE, convert to timestamp:
                                  $timestamp_start = strtotime($start);
                                }
                                else {
                                  // Otherwise, leave it as a timestamp:
                                  $timestamp_start = $start;
                                }
                                // Same as above, but make sure $end has actually been overridden with a non-null,
                                // non-empty, non-numeric value:
                                if (!is_null($end) && (!empty($end) && !is_numeric($end))) {
                                  $timestamp_end = strtotime($end);
                                }
                                else {
                                  // If $end is NULL or empty and non-numeric value, assume the end time desired
                                  // is the current time (useful for age, etc):
                                  $timestamp_end = time();
                                }
                                // Regardless, set the start and end times to an integer:
                                $start_time = (int) $timestamp_start;
                                $end_time = (int) $timestamp_end;
                              
                                // Assign these values as the params for $then and $now:
                                $start_time_var = 'start_time';
                                $end_time_var = 'end_time';
                                // Use this to determine if the output is positive (time passed) or negative (future):
                                $pos_neg = 1;
                              
                                // If the end time is at a later time than the start time, do the opposite:
                                if ($end_time <= $start_time) {
                                  $start_time_var = 'end_time';
                                  $end_time_var = 'start_time';
                                  $pos_neg = -1;
                                }
                              
                                // Convert everything to the proper format, and do some math:
                                $then = new DateTime(date('Y-m-d H:i:s', $$start_time_var));
                                $now = new DateTime(date('Y-m-d H:i:s', $$end_time_var));
                              
                                $years_then = $then->format('Y');
                                $years_now = $now->format('Y');
                                $years = $years_now - $years_then;
                              
                                $months_then = $then->format('m');
                                $months_now = $now->format('m');
                                $months = $months_now - $months_then;
                              
                                $days_then = $then->format('d');
                                $days_now = $now->format('d');
                                $days = $days_now - $days_then;
                              
                                $hours_then = $then->format('H');
                                $hours_now = $now->format('H');
                                $hours = $hours_now - $hours_then;
                              
                                $minutes_then = $then->format('i');
                                $minutes_now = $now->format('i');
                                $minutes = $minutes_now - $minutes_then;
                              
                                $seconds_then = $then->format('s');
                                $seconds_now = $now->format('s');
                                $seconds = $seconds_now - $seconds_then;
                              
                                if ($seconds < 0) {
                                  $minutes -= 1;
                                  $seconds += 60;
                                }
                                if ($minutes < 0) {
                                  $hours -= 1;
                                  $minutes += 60;
                                }
                                if ($hours < 0) {
                                  $days -= 1;
                                  $hours += 24;
                                }
                                $months_last = $months_now - 1;
                                if ($months_now == 1) {
                                  $years_now -= 1;
                                  $months_last = 12;
                                }
                              
                                // "Thirty days hath September, April, June, and November" ;)
                                if ($months_last == 9 || $months_last == 4 || $months_last == 6 || $months_last == 11) {
                                  $days_last_month = 30;
                                }
                                else if ($months_last == 2) {
                                  // Factor in leap years:
                                  if (($years_now % 4) == 0) {
                                    $days_last_month = 29;
                                  }
                                  else {
                                    $days_last_month = 28;
                                  }
                                }
                                else {
                                  $days_last_month = 31;
                                }
                                if ($days < 0) {
                                  $months -= 1;
                                  $days += $days_last_month;
                                }
                                if ($months < 0) {
                                  $years -= 1;
                                  $months += 12;
                                }
                              
                                // Finally, multiply each value by either 1 (in which case it will stay the same),
                                // or by -1 (in which case it will become negative, for future dates).
                                // Note: 0 * 1 == 0 * -1 == 0
                                $out = new stdClass;
                                $out->years = (int) $years * $pos_neg;
                                $out->months = (int) $months * $pos_neg;
                                $out->days = (int) $days * $pos_neg;
                                $out->hours = (int) $hours * $pos_neg;
                                $out->minutes = (int) $minutes * $pos_neg;
                                $out->seconds = (int) $seconds * $pos_neg;
                                return $out;
                              }
                              

                              示例用法:

                              <?php
                                $birthday = 'June 2, 1971';
                                $check_age_for_this_date = 'June 3, 1999 8:53pm';
                                $age = time_diff($birthday, $check_age_for_this_date)->years;
                                print $age;// 28
                              

                              或者:

                              <?php
                                $christmas_2020 = 'December 25, 2020';
                                $countdown = time_diff($christmas_2020);
                                print_r($countdown);
                              

                              【讨论】:

                                【解决方案22】:

                                使用示例:

                                echo time_diff_string('2013-05-01 00:22:35', 'now');
                                echo time_diff_string('2013-05-01 00:22:35', 'now', true);
                                

                                输出:

                                4 months ago
                                4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago
                                

                                功能:

                                function time_diff_string($from, $to, $full = false) {
                                    $from = new DateTime($from);
                                    $to = new DateTime($to);
                                    $diff = $to->diff($from);
                                
                                    $diff->w = floor($diff->d / 7);
                                    $diff->d -= $diff->w * 7;
                                
                                    $string = array(
                                        'y' => 'year',
                                        'm' => 'month',
                                        'w' => 'week',
                                        'd' => 'day',
                                        'h' => 'hour',
                                        'i' => 'minute',
                                        's' => 'second',
                                    );
                                    foreach ($string as $k => &$v) {
                                        if ($diff->$k) {
                                            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
                                        } else {
                                            unset($string[$k]);
                                        }
                                    }
                                
                                    if (!$full) $string = array_slice($string, 0, 1);
                                    return $string ? implode(', ', $string) . ' ago' : 'just now';
                                }
                                

                                【讨论】:

                                • 如果我想确定差异是否大于 30 分钟,我该怎么办?
                                • @OfirAttia:您在 SO 上有很多类似的问题,请使用搜索。 Simple demo
                                【解决方案23】:

                                这是我的功能。需要 PHP >= 5.3.4。它使用 DateTime 类。非常快,很快,可以区分两个日期,甚至是所谓的“时间”。

                                if(function_exists('grk_Datetime_Since') === FALSE){
                                    function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){
                                        #   Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenant
                                        if(empty($To) === TRUE){
                                            $To = time();
                                        }
                                
                                        #   On va s'assurer que $From est numérique
                                        if(is_int($From) === FALSE){
                                            $From = strtotime($From);
                                        };
                                
                                        #   On va s'assurer que $To est numérique
                                        if(is_int($To) === FALSE){
                                            $To = strtotime($To);
                                        }
                                
                                        #   On a une erreur ?
                                        if($From === FALSE OR $From === -1 OR $To === FALSE OR $To === -1){
                                            return FALSE;
                                        }
                                
                                        #   On va créer deux objets de date
                                        $From = new DateTime(@date('Y-m-d H:i:s', $From), new DateTimeZone('GMT'));
                                        $To   = new DateTime(@date('Y-m-d H:i:s', $To), new DateTimeZone('GMT'));
                                
                                        #   On va calculer la différence entre $From et $To
                                        if(($Diff = $From->diff($To)) === FALSE){
                                            return FALSE;
                                        }
                                
                                        #   On va merger le tableau des noms (par défaut, anglais)
                                        $Words = array_merge(array(
                                            'year'      => 'year',
                                            'years'     => 'years',
                                            'month'     => 'month',
                                            'months'    => 'months',
                                            'week'      => 'week',
                                            'weeks'     => 'weeks',
                                            'day'       => 'day',
                                            'days'      => 'days',
                                            'hour'      => 'hour',
                                            'hours'     => 'hours',
                                            'minute'    => 'minute',
                                            'minutes'   => 'minutes',
                                            'second'    => 'second',
                                            'seconds'   => 'seconds'
                                        ), $Words);
                                
                                        #   On va créer la chaîne maintenant
                                        if($Diff->y > 1){
                                            $Text = $Diff->y.' '.$Words['years'];
                                        } elseif($Diff->y == 1){
                                            $Text = '1 '.$Words['year'];
                                        } elseif($Diff->m > 1){
                                            $Text = $Diff->m.' '.$Words['months'];
                                        } elseif($Diff->m == 1){
                                            $Text = '1 '.$Words['month'];
                                        } elseif($Diff->d > 7){
                                            $Text = ceil($Diff->d/7).' '.$Words['weeks'];
                                        } elseif($Diff->d == 7){
                                            $Text = '1 '.$Words['week'];
                                        } elseif($Diff->d > 1){
                                            $Text = $Diff->d.' '.$Words['days'];
                                        } elseif($Diff->d == 1){
                                            $Text = '1 '.$Words['day'];
                                        } elseif($Diff->h > 1){
                                            $Text = $Diff->h.' '.$Words['hours'];
                                        } elseif($Diff->h == 1){
                                            $Text = '1 '.$Words['hour'];
                                        } elseif($Diff->i > 1){
                                            $Text = $Diff->i.' '.$Words['minutes'];
                                        } elseif($Diff->i == 1){
                                            $Text = '1 '.$Words['minute'];
                                        } elseif($Diff->s > 1){
                                            $Text = $Diff->s.' '.$Words['seconds'];
                                        } else {
                                            $Text = '1 '.$Words['second'];
                                        }
                                
                                        return $Prefix.$Text.$Suffix;
                                    }
                                }
                                

                                【讨论】:

                                  【解决方案24】:
                                  $date1 = date_create('2007-03-24');
                                  $date2 = date_create('2009-06-26');
                                  $interval = date_diff($date1, $date2);
                                  echo "difference : " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days ";
                                  

                                  【讨论】:

                                    【解决方案25】:

                                    一分钱,一磅: 我刚刚回顾了几个解决方案,所有解决方案都使用 floor() 提供了一个复杂的解决方案,然后四舍五入到 26 年 12 个月和 2 天的解决方案,本来应该是 25 年、11 个月和 20 天!!!!

                                    这是我的这个问题的版本: 可能不优雅,可能没有很好的编码,但如果你不计算闰年,可以更接近答案,显然闰年可以编码到这个,但在这种情况下 - 正如其他人所说,也许你可以提供这个答案:: 我已经包含了所有 TEST 条件和 print_r,以便您可以更清楚地看到结果的构造: 来了,

                                    // 设置你的输入日期/变量::

                                    $ISOstartDate   = "1987-06-22";
                                    $ISOtodaysDate = "2013-06-22";
                                    

                                    //我们需要将ISO yyyy-mm-dd格式EXPLODE为yyyy mm dd,如下::

                                    $yDate[ ] = explode('-', $ISOstartDate); print_r ($yDate);

                                    $zDate[ ] = explode('-', $ISOtodaysDate); print_r ($zDate);

                                    // Lets Sort of the Years!
                                    // Lets Sort out the difference in YEARS between startDate and todaysDate ::
                                    $years = $zDate[0][0] - $yDate[0][0];
                                    
                                    // We need to collaborate if the month = month = 0, is before or after the Years Anniversary ie 11 months 22 days or 0 months 10 days...
                                    if ($months == 0 and $zDate[0][1] > $ydate[0][1]) {
                                        $years = $years -1;
                                    }
                                    // TEST result
                                    echo "\nCurrent years => ".$years;
                                    
                                    // Lets Sort out the difference in MONTHS between startDate and todaysDate ::
                                    $months = $zDate[0][1] - $yDate[0][1];
                                    
                                    // TEST result
                                    echo "\nCurrent months => ".$months;
                                    
                                    // Now how many DAYS has there been - this assumes that there is NO LEAP years, so the calculation is APPROXIMATE not 100%
                                    // Lets cross reference the startDates Month = how many days are there in each month IF m-m = 0 which is a years anniversary
                                    // We will use a switch to check the number of days between each month so we can calculate days before and after the years anniversary
                                    
                                    switch ($yDate[0][1]){
                                        case 01:    $monthDays = '31';  break;  // Jan
                                        case 02:    $monthDays = '28';  break;  // Feb
                                        case 03:    $monthDays = '31';  break;  // Mar
                                        case 04:    $monthDays = '30';  break;  // Apr
                                        case 05:    $monthDays = '31';  break;  // May
                                        case 06:    $monthDays = '30';  break;  // Jun
                                        case 07:    $monthDays = '31';  break;  // Jul
                                        case 08:    $monthDays = '31';  break;  // Aug
                                        case 09:    $monthDays = '30';  break;  // Sept
                                        case 10:    $monthDays = '31';  break;  // Oct
                                        case 11:    $monthDays = '30';  break;  // Nov
                                        case 12:    $monthDays = '31';  break;  // Dec
                                    };
                                    // TEST return
                                    echo "\nDays in start month ".$yDate[0][1]." => ".$monthDays;
                                    
                                    
                                    // Lets correct the problem with 0 Months - is it 11 months + days, or 0 months +days???
                                    
                                    $days = $zDate[0][2] - $yDate[0][2] +$monthDays;
                                    echo "\nCurrent days => ".$days."\n";
                                    
                                    // Lets now Correct the months to being either 11 or 0 Months, depending upon being + or - the years Anniversary date 
                                    // At the same time build in error correction for Anniversary dates not being 1yr 0m 31d... see if ($days == $monthDays )
                                    if($days < $monthDays && $months == 0)
                                        {
                                        $months = 11;       // If Before the years anniversary date
                                        }
                                    else    {
                                        $months = 0;        // If After the years anniversary date
                                        $years = $years+1;  // Add +1 to year
                                        $days = $days-$monthDays;   // Need to correct days to how many days after anniversary date
                                        };
                                    // Day correction for Anniversary dates
                                    if ($days == $monthDays )   // if todays date = the Anniversary DATE! set days to ZERO
                                        {
                                        $days = 0;          // days set toZERO so 1 years 0 months 0 days
                                        };
                                    
                                        echo "\nTherefore, the number of years/ months/ days/ \nbetween start and todays date::\n\n";
                                    
                                        printf("%d years, %d months, %d days\n", $years, $months, $days);
                                    

                                    最终结果是:: 26年0个月0天

                                    这就是我在 2013 年 6 月 22 日的营业时间 - 哎呀!

                                    【讨论】:

                                      【解决方案26】:

                                      您还可以使用以下代码通过向上取整返回日期差异 $date1 = $duedate; // 分配截止日期 echo $date2 = date("Y-m-d"); // 当前的日期 $ts1 = strtotime($date1); $ts2 = strtotime($date2); $seconds_diff = $ts1 - $ts2; 回声 $datediff = ceil(($seconds_diff/3600)/24); // 返回天数

                                      如果您使用 php 的 floor 方法而不是 ceil ,它将返回向下的整数部分。请在此处检查差异,有时如果您的登台服务器时区与实时站点时区不同,在这种情况下您可能会得到不同的结果,因此请相应地更改条件。

                                      【讨论】:

                                        【解决方案27】:

                                        最好的做法是使用 PHP 的 DateTime(和 DateInterval)对象。每个日期都封装在一个DateTime对象中,然后就可以做两者的区别了:

                                        $first_date = new DateTime("2012-11-30 17:03:30");
                                        $second_date = new DateTime("2012-12-21 00:00:00");
                                        

                                        DateTime 对象将接受strtotime() 将接受的任何格式。如果需要更具体的日期格式,可以使用 DateTime::createFromFormat() 来创建 DateTime 对象。

                                        两个对象都被实例化后,你用DateTime::diff()从另一个中减去一个。

                                        $difference = $first_date->diff($second_date);
                                        

                                        $difference 现在拥有一个带有差异信息的DateInterval 对象。 var_dump() 看起来像这样:

                                        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
                                        

                                        要格式化 DateInterval 对象,我们需要检查每个值,如果为 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;
                                        }
                                        

                                        现在剩下的就是在 $difference DateInterval 对象上调用我们的函数:

                                        echo format_interval($difference);
                                        

                                        我们得到正确的结果:

                                        20 天 6 小时 56 分 30 秒

                                        用于实现目标的完整代码:

                                        /**
                                         * 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);
                                        

                                        【讨论】:

                                        • DateTime() 不是一个函数,它是一个对象,它从 PHP 5.2 开始就存在了。确保您的服务器支持它。
                                        • @SecondRikudo DateTime::Diff 需要 PHP 5.3.0
                                        • 我们有问题,将 first_date 换成 second_date 并且得到相同的结果?为什么不说 0 天 0 小时 0 分钟 0 秒或只有 0。例如:2012-11-30 17:03:30 - 2012-12-21 00:00:00 和 2012-12-21 00:00:00 - 2012-11-30 17:03:30 得到相同的结果。
                                        • 因为 diff 为您提供了两次之间的差异。无论哪个日期晚,差值都不为 0。
                                        • 这是一个真的很好的答案,因为它提供了一个清晰的函数,可以从代码库中的任何位置调用,而无需大量时间计算。其他答案允许您即时放弃解决症状而不是解决问题的回显计算......我添加的唯一元素(几乎所有其他帖子都没有涵盖这一点)是 $interval 元素的复数如果超过 1。
                                        【解决方案28】:

                                        DateInterval 很棒,但有几点需要注意:

                                        1. 仅适用于 PHP 5.3+(但这真的不再是一个好借口
                                        2. 仅支持年、月、日、小时、分钟和秒(无周)
                                        3. 它计算上述所有 + 天的差异(您无法仅获得月份的差异)

                                        为了克服这个问题,我编写了以下代码(从 @enobrev answer 改进):

                                        function date_dif($since, $until, $keys = 'year|month|week|day|hour|minute|second')
                                        {
                                            $date = array_map('strtotime', array($since, $until));
                                        
                                            if ((count($date = array_filter($date, 'is_int')) == 2) && (sort($date) === true))
                                            {
                                                $result = array_fill_keys(explode('|', $keys), 0);
                                        
                                                foreach (preg_grep('~^(?:year|month)~i', $result) as $key => $value)
                                                {
                                                    while ($date[1] >= strtotime(sprintf('+%u %s', $value + 1, $key), $date[0]))
                                                    {
                                                        ++$value;
                                                    }
                                        
                                                    $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
                                                }
                                        
                                                foreach (preg_grep('~^(?:year|month)~i', $result, PREG_GREP_INVERT) as $key => $value)
                                                {
                                                    if (($value = intval(abs($date[0] - $date[1]) / strtotime(sprintf('%u %s', 1, $key), 0))) > 0)
                                                    {
                                                        $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
                                                    }
                                                }
                                        
                                                return $result;
                                            }
                                        
                                            return false;
                                        }
                                        

                                        它运行两个循环;第一个通过暴力破解处理相对间隔(年和月),第二个通过简单的算术计算额外的绝对间隔(所以它更快):

                                        echo humanize(date_dif('2007-03-24', '2009-07-31', 'second')); // 74300400 seconds
                                        echo humanize(date_dif('2007-03-24', '2009-07-31', 'minute|second')); // 1238400 minutes, 0 seconds
                                        echo humanize(date_dif('2007-03-24', '2009-07-31', 'hour|minute|second')); // 20640 hours, 0 minutes, 0 seconds
                                        echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|day')); // 2 years, 129 days
                                        echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week')); // 2 years, 18 weeks
                                        echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week|day')); // 2 years, 18 weeks, 3 days
                                        echo humanize(date_dif('2007-03-24', '2009-07-31')); // 2 years, 4 months, 1 week, 0 days, 0 hours, 0 minutes, 0 seconds
                                        
                                        function humanize($array)
                                        {
                                            $result = array();
                                        
                                            foreach ($array as $key => $value)
                                            {
                                                $result[$key] = $value . ' ' . $key;
                                        
                                                if ($value != 1)
                                                {
                                                    $result[$key] .= 's';
                                                }
                                            }
                                        
                                            return implode(', ', $result);
                                        }
                                        

                                        【讨论】:

                                        • @PeterMortensen:应该可以,但我不保证。设置您的时区并尝试一下。
                                        【解决方案29】:
                                        // If you just want to see the year difference then use this function.
                                        // Using the logic I've created you may also create month and day difference
                                        // which I did not provide here so you may have the efforts to use your brain.
                                        // :)
                                        $date1='2009-01-01';
                                        $date2='2010-01-01';
                                        echo getYearDifference ($date1,$date2);
                                        function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
                                            $year = 0;
                                            while($date2 > $date1 = strtotime('+1 year', $date1)){
                                                ++$year;
                                            }
                                            return $year;
                                        }
                                        

                                        【讨论】:

                                        • "strtotime('+1 year', $date1)" 是否考虑闰年?
                                        【解决方案30】:

                                        当 PHP 5.3(分别为 date_diff())不可用时,我正在使用我编写的以下函数:

                                                function dateDifference($startDate, $endDate)
                                                {
                                                    $startDate = strtotime($startDate);
                                                    $endDate = strtotime($endDate);
                                                    if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0 || $startDate > $endDate)
                                                        return false;
                                        
                                                    $years = date('Y', $endDate) - date('Y', $startDate);
                                        
                                                    $endMonth = date('m', $endDate);
                                                    $startMonth = date('m', $startDate);
                                        
                                                    // Calculate months
                                                    $months = $endMonth - $startMonth;
                                                    if ($months <= 0)  {
                                                        $months += 12;
                                                        $years--;
                                                    }
                                                    if ($years < 0)
                                                        return false;
                                        
                                                    // Calculate the days
                                                    $measure = ($months == 1) ? 'month' : 'months';
                                                    $days = $endDate - strtotime('+' . $months . ' ' . $measure, $startDate);
                                                    $days = date('z', $days);   
                                        
                                                    return array($years, $months, $days);
                                                }
                                        

                                        【讨论】:

                                          猜你喜欢
                                          • 2011-05-16
                                          • 2011-05-21
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          相关资源
                                          最近更新 更多