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;
答案 0 :(得分: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));
这适用于我的开发系统(5.3.4)和我的部署系统(5.2.11)。
答案 1 :(得分:6)
我只需要(不幸的是)WordPress插件。我在2次使用该功能:
在我的课堂上调用 - &gt; diff()(我的课程扩展 DateTime ,所以 $ this < / strong>是参考 DateTime )
function diff ($secondDate){
$firstDateTimeStamp = $this->format("U");
$secondDateTimeStamp = $secondDate->format("U");
$rv = ($secondDateTimeStamp - $firstDateTimeStamp);
$di = new DateInterval($rv);
return $di;
}
然后我重新创建了一个假的DateInterval类(因为DateInterval仅在PHP&gt; = 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;
}
}
希望能帮助某人。
答案 2 :(得分: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 ...
}
答案 3 :(得分:3)
我试图改善Christopher Pickslay的答案。
我创建了这个函数,它返回并使用原始DateInterval
对象中的大多数属性进行对象。
没有“days”属性,因为我的测试服务器中似乎是some bug(它总是返回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;
}
答案 4 :(得分: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);
如果您需要数周,您当然可以$days_diff % 7
。
不幸的是,手动技术在几周之后就会崩溃,因为数月和数年的长度是变化的(技术上也是天数,考虑到夏令时,但你可能会忽略这一点,特别是因为你只需要一个小时最多,但希望这足以让你开始。
答案 5 :(得分:2)
阅读PHP date_diff页面中的contrib注释 http://us3.php.net/manual/en/function.date-diff.php
答案 6 :(得分:2)
Spudley很接近,但你需要使用gmdate而不是日期。
所以这可以工作24小时或更短时间(如果它至少是正值):
$difference = $date2->format('U') - $date1->format('U');
$time_diff = gmdate('H:i:s',$difference);
答案 7 :(得分:0)
PHP有使用Unix时间戳的方法。
正如其他人所指出的那样,通过使用Unix日期以来的秒数,可以很容易地计算出时间。
PHP的strtotime()将日期转换为时间戳:
$diff = round((strtotime($list['start']) - strtotime($list['finish'])) / 86400);
如果您希望计算到当前时间,则time()提供“now”的时间戳:
$diff = round((time() - strtotime($list['date'])) / 86400);
86400是一天中的秒数 如果您希望转换为年份,请使用31557000,这几乎就是365.24219 * 86400。
这里的一个额外优势是,strtotime可以采用几乎任何人类可读格式的输入日期,因此在代码中使用非常容易。
答案 8 :(得分:0)
请注意,如果您的DateTime对象是从没有任何时区信息的日期字符串创建的(如'2012-01-01 05:00:00',就像来自mysql),那么稍后通过setTimeZone设置DateTimeZone对象的时区()不会更改DateTime对象的内部时间戳。
$localtime = new DateTime('2012-01-01 08:00:00+02:00'); // Europe/Copenhagen (+ daylight savings)
$localtime->setTimezone(new DateTimeZone('UTC')); // convert local time to utc
$utctime = new DateTime('2012-01-01 06:00:00'); // timezone assumed utc, but is in fact unknown
$utctime->setTimezone(new DateTimeZone('UTC')); // trying to rectify missing timezone which fails, because the internal timestamp isn't modified, although any other format than 'U' may indicate so
#$utctime = new DateTime('2012-01-01 06:00:00+00:00'); // timezone stated, this works
$diff = intval($localtime->format('U')) - intval($utctime->format('U'));
echo $diff; // expecting zero
答案 9 :(得分:0)
这是您问题的最佳解决方案。
<?php
/* Find difference between two dates in days. PHP 5.2.x. */
$d1 = date('Y-m-d', strtotime('2013-06-13'));
$d2 = date("Y-m-d");
echo diff($d1, $d2);
function diff($date1, $date2) {
$diff = abs(strtotime($date2) - strtotime($date1));
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24) / (60*60*24));
return $days;
}
?>