什么可以用于PHP 5.2的DateTime :: diff()?

shi*_*hin 26 php php-5.2

在PHP 5.2中是否有与DateTime :: diff()等效的函数?

我的本地服务器是PHP 5.3并使用DateTime :: diff().然后我发现我的实时网站使用PHP 5.2并给出错误.

Fatal error: Call to undefined method DateTime::diff() in /var/www/some/other/dir/web/daikon/modules/projects/views/admin/log/admin_log_list.php on line 40
Run Code Online (Sandbox Code Playgroud)

PHP代码:

 foreach ($logs as $key => $list){
 ...
 // show date in European way dd-mm-yyyy not in MySQL way yyyy-mm-dd
    $newdate =new DateTime($list['date']) ;
    echo "<td class=\"left\" width=\"8%\">".$newdate->format('d-m-Y')."</td>\n";
    $starttime = new DateTime($list['start_time']);
    echo "<td width=\"7%\">".date_format($starttime, 'H:i')."</td>\n";
    $finishtime = new DateTime($list['finish_time']);
    echo "<td width=\"8%\">".date_format($finishtime, 'H:i')."</td>\n";
    $timediff = 0;
    $interval = $starttime->diff($finishtime);
    $hours   = $interval->format('%h');
    $minutes = $interval->format('%i');
    $timediff = $hours * 60 + $minutes;
Run Code Online (Sandbox Code Playgroud)

Chr*_*lay 40

Spudley的答案对我不起作用 - 从我的系统中减去任何DateTime给出0.

通过使用带有'U'说明符的DateTime :: format(自Unix纪元以来的秒数),我能够使它工作:

$start = new DateTime('2010-10-12');
$end = new DateTime();
$days = round(($end->format('U') - $start->format('U')) / (60*60*24));
Run Code Online (Sandbox Code Playgroud)

这适用于我的开发系统(5.3.4)和我的部署系统(5.2.11).

  • 几乎完美,除了你使用`abs()`,它假设它总是正面的. (2认同)

nem*_*ton 6

我只是需要(不幸的是)一个WordPress插件.这个我在2次使用该功能:

  1. 在我的类中调用- > diff()(我的类扩展了DateTime,所以$ this是引用DateTime)

    function diff ($secondDate){
        $firstDateTimeStamp = $this->format("U");
        $secondDateTimeStamp = $secondDate->format("U");
        $rv = ($secondDateTimeStamp - $firstDateTimeStamp);
        $di = new DateInterval($rv);
        return $di;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

希望能帮到别人.


Spu*_*ley 2

是的,令人烦恼的是 PHP5.2 中没有这个功能。

我假设你不能升级到5.3?你应该调查一下;没有什么理由不升级;但我认为无论出于何种原因你都不能这样做。

第一个提示:如果您只需要小于 24 小时的差异,您可以简单地减去两个时间戳,然后执行$time_diff = date('H:i:s',$subtracted_value);

如果您要做的差异超过 24 小时,但只需返回天数和时间差就可以了,您可以通过对减去的值进行模数计算来扩展上述技术,并针对一天的秒数(即24*60*60,即86400)

$subtracted_value = $date1 - $date2;
$days_diff = $subtracted_value % 86400;
$time_diff = date('H:i:s',$subtracted_value);
Run Code Online (Sandbox Code Playgroud)

如果你需要几周的时间,你当然可以这样做$days_diff % 7

不幸的是,手动技术在几周后就会崩溃,因为月和年的长度是可变的(从技术上讲,考虑到夏令时,天也是可变的,但你可能可以忽略这一点,特别是因为你只会出去一小时,在最多),但希望这足以让您开始。