首页>Program>source

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

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;
最新回答
  • 2021-1-11
    1 #

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

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

  • 2021-1-11
    2 #

    (不幸的是)我只需要一个wordPress插件.我两次使用了该功能:

    在我的班上叫 ->diff() (我的Class扩展了 DateTime ,所以 $this 是参考 DateTime

    function diff ($secondDate){
        $firstDateTimeStamp = $this->format("U");
        $secondDateTimeStamp = $secondDate->format("U");
        $rv = ($secondDateTimeStamp - $firstDateTimeStamp);
        $di = new DateInterval($rv);
        return $di;
    }
    

    然后我重新创建了一个假的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;
        }
    }
    

    希望对某人有帮助。

  • 2021-1-11
    3 #

    我使用了它,似乎工作正常-显然,您可以添加第二个参数以使其更灵活:

    function GetDateDiffFromNow($originalDate) 
    {
        $unixOriginalDate = strtotime($originalDate);
        $unixNowDate = strtotime('now');
        $difference = $unixNowDate - $unixOriginalDate ;
        $days = (int)($difference / 86400);
        $hours = (int)($difference / 3600);
        $minutes = (int)($difference / 60);
        $seconds = $difference;
        // now do what you want with this now and return ...
    }
    

  • 2021-1-11
    4 #

    我正在尝试改善Christopher Pickslay的答案.

    我制作了此函数,该函数返回对象并具有原始 DateInterval的大多数属性 目的.

    没有" days"属性,因为它似乎是我的测试服务器中的一些错误(始终返回6015).

    此外,我假设每个月都有30天,这绝对不准确,但可能会有所帮助.

    function dateTimeDiff($date1, $date2) {
        $alt_diff = new stdClass();
        $alt_diff->y =  floor(abs($date1->format('U') - $date2->format('U')) / (60*60*24*365));
        $alt_diff->m =  floor((floor(abs($date1->format('U') - $date2->format('U')) / (60*60*24)) - ($alt_diff->y * 365))/30);
        $alt_diff->d =  floor(floor(abs($date1->format('U') - $date2->format('U')) / (60*60*24)) - ($alt_diff->y * 365) - ($alt_diff->m * 30));
        $alt_diff->h =  floor( floor(abs($date1->format('U') - $date2->format('U')) / (60*60)) - ($alt_diff->y * 365*24) - ($alt_diff->m * 30 * 24 )  - ($alt_diff->d * 24) );
        $alt_diff->i = floor( floor(abs($date1->format('U') - $date2->format('U')) / (60)) - ($alt_diff->y * 365*24*60) - ($alt_diff->m * 30 * 24 *60)  - ($alt_diff->d * 24 * 60) -  ($alt_diff->h * 60) );
        $alt_diff->s =  floor( floor(abs($date1->format('U') - $date2->format('U'))) - ($alt_diff->y * 365*24*60*60) - ($alt_diff->m * 30 * 24 *60*60)  - ($alt_diff->d * 24 * 60*60) -  ($alt_diff->h * 60*60) -  ($alt_diff->i * 60) );
        $alt_diff->invert =  (($date1->format('U') - $date2->format('U')) > 0)? 0 : 1 ;
        return $alt_diff;
    }   
    

  • 2021-1-11
    5 #

    是的,令人讨厌的是,该功能并未纳入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);
    

    如果您需要几个星期,您当然可以做 $days_diff % 7

    不幸的是,手动技术在几周后就失效了,因为几个月和几年的长度是可变的(考虑到夏令时,技术上也是如此,但是您可能会忽略这一点,尤其是因为您只需要一个小时 最多),但希望这足以让您入门。

相关问题

  • c#:NET 40和可怕的OnUserPreferenceChanged挂起
  • ios:如何在Swift中获取2数组的公共元素列表?