在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).
我只是需要(不幸的是)一个WordPress插件.这个我在2次使用该功能:
在我的类中调用- > 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)然后我重新创建了一个假的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)希望能帮到别人.
是的,令人烦恼的是 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。
不幸的是,手动技术在几周后就会崩溃,因为月和年的长度是可变的(从技术上讲,考虑到夏令时,天也是可变的,但你可能可以忽略这一点,特别是因为你只会出去一小时,在最多),但希望这足以让您开始。