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-111 #
- 2021-1-112 #
(不幸的是)我只需要一个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-113 #
我使用了它,似乎工作正常-显然,您可以添加第二个参数以使其更灵活:
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-114 #
我正在尝试改善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-115 #
是的,令人讨厌的是,该功能并未纳入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
不幸的是,手动技术在几周后就失效了,因为几个月和几年的长度是可变的(考虑到夏令时,技术上也是如此,但是您可能会忽略这一点,尤其是因为您只需要一个小时 最多),但希望这足以让您入门。
Spudley的答案对我不起作用-将另一个DateTime减去另一个就得出系统上的0。
我可以通过使用带有'U'说明符的DateTime :: format使它工作(自Unix时代以来的秒数):
这同时适用于我的开发系统(5.3.4)和部署系统(5.2.11)。