【问题标题】:Calculating number of years between 2 dates in PHP计算PHP中2个日期之间的年数
【发布时间】:2011-03-22 05:20:35
【问题描述】:

我需要从提供的 2 个日期中获取年数。这是我的代码:

function daysDifference($endDate, $beginDate)
{
   $date_parts1=explode("-", $beginDate);
   $date_parts2=explode("-", $endDate);

   $start_date=gregoriantojd($date_parts1[1], $date_parts1[2], $date_parts1[0]);
   $end_date=gregoriantojd($date_parts2[1], $date_parts2[2], $date_parts2[0]);
   $diff = $end_date - $start_date;
   echo $diff;
   $years = floor($diff / (365.25*60*60*24));
   return $years;
}

echo daysDifference('2011-03-12','2008-03-09');

$diff 给出一个数字输出。当我返回$years 时,我得到了0。我做错了什么?

【问题讨论】:

标签: php date


【解决方案1】:
$d1 = new DateTime('2011-03-12');
$d2 = new DateTime('2008-03-09');

$diff = $d2->diff($d1);

echo $diff->y;

【讨论】:

  • 对,这个应该是推荐的。
【解决方案2】:

在 PHP 5.2 机器上(是的,它们仍然存在)所以没有 DateTime::diff() 支持,我最终使用了这个:

$dateString='10-05-1975';
$years = round((time()-strtotime($dateString))/(3600*24*365.25))

【讨论】:

    【解决方案3】:

    $start_date 和 $end_date' 值是天数,而不是秒数。所以你不应该将 $diff 与 365.25*60*60*24 分开。

    function daysDifference($endDate, $beginDate)
    {
    
       $date_parts1 = explode("-", $beginDate);
       $date_parts2 = explode("-", $endDate);
       $start_date = gregoriantojd($date_parts1[1], $date_parts1[2], $date_parts1[0]);
       $end_date = gregoriantojd($date_parts2[1], $date_parts2[2], $date_parts2[0]);
       $diff = abs($end_date - $start_date);
       $years = floor($diff / 365.25);
       return $years;
    }
    
    echo daysDifference('2011-03-12','2008-03-09');
    

    【讨论】:

      【解决方案4】:

      如果您想要两个日期之间的年数,为什么不直接使用以下内容:

      function yearsDifference($endDate, $beginDate)
      {
         $date_parts1=explode("-", $beginDate);
         $date_parts2=explode("-", $endDate);
         return $date_parts2[0] - $date_parts1[0];
      }
      
      echo yearsDifference('2011-03-12','2008-03-09');
      

      在这种情况下,你会得到什么:

      3
      

      【讨论】:

      • 他想要朱利安日的不同
      • 这可能不会给出预期的结果。 12 月 31 日和 1 月 1 日呢?我认为这不应该是一整年,但这取决于具体情况。
      • 这个只会返回年份数字之间的差异。这是误导。
      • 这不考虑您是否需要 01-12-2017 到 01-01-2018 或 01-12-2017 到 02-12-2018 之间的差异。结果是一样的,这是非常错误的。
      【解决方案5】:

      伙计们,这是我曾经使用过的一个很好的代码......这不是我的想法......我只是从网上的某个地方得到的......

      它也有多种选择,希望对你有所帮助............

          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)) < $dateto) {
                  $months_difference++;
              }
              $months_difference--;
              $datediff = $months_difference;
              break;
      
          case 'y': // Difference between day numbers
      
              $datediff = date("z", $dateto) - date("z", $datefrom);
              break;
      
          case "d": // Number of full days
      
              $datediff = floor($difference / 86400);
              break;
      
          case "w": // Number of full weekdays
      
              $days_difference = floor($difference / 86400);
              $weeks_difference = floor($days_difference / 7); // Complete weeks
              $first_day = date("w", $datefrom);
              $days_remainder = floor($days_difference % 7);
              $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
              if ($odd_days > 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;
      
      } 
      
      echo datediff('yyyy','2009-01-16','2011-03-16');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 2012-07-18
        相关资源
        最近更新 更多