【问题标题】:php 5.3 date diff equivalent for PHP <= 5.2 on own functionphp 5.3 date diff 等效于 PHP <= 5.2 在自己的函数上
【发布时间】:2026-02-20 08:20:08
【问题描述】:

我正在使用一个函数(在网上找到它)来计算到现在为止的时间。我传递了两个参数:发布日期和当前日期。它将返回年、月、日、小时、分钟或秒。它使用 PHP 5.3 的 date diff 函数,这在 5.2 版本中是不会的 :(

function pluralize( $zaehler, $inhalt ) { 
return trim($zaehler . ( ( $zaehler == 1 ) ? ( " $inhalt" ) : ( " ${inhalt}s" ) )." ago");}function ago($datetime, $datetime_post){     

$interval = date_create($datetime_post)->diff( date_create($datetime) );

if ( $interval->y >= 1 ) return pluralize( $interval->y, 'year' );
if ( $interval->m >= 1 ) return pluralize( $interval->m, 'month' );
if ( $interval->d >= 1 ) return pluralize( $interval->d, 'day' );
if ( $interval->h >= 1 ) return pluralize( $interval->h, 'hour' );
if ( $interval->i >= 1 ) return pluralize( $interval->i, 'minute' );
if ( $interval->s >= 1 ) return pluralize( $interval->s, 'second' );}

示例:

$post_date_time = "01/01/2012 11:30:22";
$current_date_time = "02/02/2012 07:35:41";

echo ago($current_date_time, $post_date_time);

将输出:

1 month

现在我需要一个等效的函数“ago”来做同样的事情,具体取决于 $interval 对象。

非常感谢

附加信息: 提供的解决方案都没有真正做到我想要的。我必须改进我的解释,对不起。 最后,我只需要 $interval 对象即可:

object(DateInterval)#3 (8) { ["y"]=> int(0) ["m"]=> int(1) ["d"]=> int(0) ["h"]=> int(20) ["i"]=> int(5) ["s"]=> int(19) ["invert"]=> int(0) ["days"]=> int(6015) }

没有必要改变这么多东西。

【问题讨论】:

  • 你不能用*.com/questions/676824/…吗?
  • 另外,如果您不知道,您可以使用 PHP 的 date( ... ) 函数获取当前日期时间:php.net/manual/en/function.date.php
  • 很容易得到两个日期的差异,以秒为单位。将秒转换为小时、分钟和天是微不足道的。转换为月和年……如果您假设每个月有 30 天并且每年有 12 个 30 天的月份,那么这很容易。这个解决方案可以接受吗?
  • 你可能想看看 Zend Framework 的 Zend_Date-component:framework.zend.com/manual/en/… 明确一点,你不需要完整的 Zend Framework,只需要 Zend/Date.php,Zend/Date/和 Zend/Locale.php(依赖)。那么你应该可以在你的代码中使用new Zend_Date()...
  • @vivid-colours:谢谢,很遗憾没有。我期望的输出应该只有一种类型,例如“2 个月前”或“34 分钟前”。和 twitter/fb 一样。

标签: php datetime datediff php-5.2


【解决方案1】:

试试我在用什么。

function dateDiff($dformat, $endDate, $beginDate)
{
$date_parts1=explode($dformat, $beginDate);
$date_parts2=explode($dformat, $endDate);
$start_date=gregoriantojd($date_parts1[0], $date_parts1[1], $date_parts1[2]);
$end_date=gregoriantojd($date_parts2[0], $date_parts2[1], $date_parts2[2]);
return $end_date - $start_date;
}

$dformat 是您在日期中使用的分隔符。

【讨论】:

  • 你为什么不使用 strtotime() - php.net/manual/en/function.strtotime.php
  • 对我来说 gregoriantojd 更好,因为我不必担心日期格式,因为它将日期部分作为参数并且函数以天为单位返回。但也可以使用 strtotime();
【解决方案2】:

有一个简单的方法。您可以更改其中的一些内容,使其符合您的需求。

<?php //preparing values
date_default_timezone_set('Europe/Berlin');

$startDate = '2011-01-21 09:00:00';
$endDate = date('Y-m-d H:i:s');

// time span seconds
$sec = explode(':', (gmdate('Y:m:d:H:i:s', strtotime($endDate) - strtotime($startDate))));

// getting all the data into array
$data = array();
list($data['years'], $data['months'], $data['days'], $data['hours'], $data['minutes'], $data['seconds']) = $sec;
$data['years'] -= 1970;

var_dump($data);

?>

【讨论】:

    【解决方案3】:

    我只是需要它(不幸的是)用于 WordPress 插件。这个我用了2次这个功能。我发布了这个答案here

    1. 在我的班级调用 ->diff() (我的班级扩展了 DateTime,所以 $this 是参考日期时间

      function diff ($secondDate){
          $firstDateTimeStamp = $this->format("U");
          $secondDateTimeStamp = $secondDate->format("U");
          $rv = ($secondDateTimeStamp - $firstDateTimeStamp);
          $di = new DateInterval($rv);
          return $di;
      }
      
    2. 然后我重新创建了一个假 DateInterval 类(因为 DateInterval 仅在 PHP >= 5.3 中有效)如下:

      Class DateInterval {
          /* Properties */
          public $y = 0;
          public $m = 0;
          public $d = 0;
          public $h = 0;
          public $i = 0;
          public $s = 0;
      
          /* Methods */
          public function __construct ( $time_to_convert /** in seconds */) {
              $FULL_YEAR = 60*60*24*365.25;
              $FULL_MONTH = 60*60*24*(365.25/12);
              $FULL_DAY = 60*60*24;
              $FULL_HOUR = 60*60;
              $FULL_MINUTE = 60;
              $FULL_SECOND = 1;
      
      //        $time_to_convert = 176559;
              $seconds = 0;
              $minutes = 0;
              $hours = 0;
              $days = 0;
              $months = 0;
              $years = 0;
      
              while($time_to_convert >= $FULL_YEAR) {
                  $years ++;
                  $time_to_convert = $time_to_convert - $FULL_YEAR;
              }
      
              while($time_to_convert >= $FULL_MONTH) {
                  $months ++;
                  $time_to_convert = $time_to_convert - $FULL_MONTH;
              }
      
              while($time_to_convert >= $FULL_DAY) {
                  $days ++;
                  $time_to_convert = $time_to_convert - $FULL_DAY;
              }
      
              while($time_to_convert >= $FULL_HOUR) {
                  $hours++;
                  $time_to_convert = $time_to_convert - $FULL_HOUR;
              }
      
              while($time_to_convert >= $FULL_MINUTE) {
                  $minutes++;
                  $time_to_convert = $time_to_convert - $FULL_MINUTE;
              }
      
              $seconds = $time_to_convert; // remaining seconds
              $this->y = $years;
              $this->m = $months;
              $this->d = $days;
              $this->h = $hours;
              $this->i = $minutes;
              $this->s = $seconds;
          }
      }
      

    希望对某人有所帮助。

    【讨论】: