1

基本上我想获得剩余时间到期。我在 php 5.3.x 中很容易做到,如下所示

$now = new DateTime();
$future_date =  new DateTime($enddate);
$interval = $future_date->diff($now,false); // ->diff will not work on 5.2.x
$interval->format("%d d, %h h, %i m");

我怎样才能在PHP 中做一些事情: 5.2.x(5.2.17)

我尝试了什么:

new DateTime(date('Y-m-d H:i:s', $now->format('U') - $future_date->format('U')));

没有提供预期的结果。

4

3 回答 3

3

因为 PHP < 5.3 不支持DateInterval该类,DateTime::diff()(这是这样做的正确方法)不可用。您需要手动执行此操作才能使其在 5.2.x 中工作。

数学其实很简单:

// Get the difference between the two dates, in seconds
$diff = $future_date->format('U') - $now->format('U');

// Calculate the days component
$d = floor($diff / 86400);
$diff %= 86400;

// Calculate the hours component
$h = floor($diff / 3600);
$diff %= 3600;

// Calculate the minutes component
$m = floor($diff / 60);

// Calculate the seconds component
$s = $diff % 60;

// $d, $h, $m and $s now contain the values you want, so you can just build a
// string from them
$str = "$d d, $h h, $m m, $s s";

然而,对于较大的间隔,这将引入不准确,因为它没有考虑闰秒。这意味着您可能会结束几秒钟 - 但由于您的原始格式字符串不包含秒组件,我怀疑这对您正在做的事情太重要了。

另请注意,您需要从 中减去$now$future_date而不是相反,否则结果将为负数。

看到它工作

于 2012-12-10T10:42:13.830 回答
1

我尝试过的似乎有效,并且与您尝试过的相差不远:

echo $now = date('Y-m-d H:i:s');
echo PHP_EOL;
echo $future = date('Y-m-d H:i:s', strtotime('today + 3 days'));
echo PHP_EOL;
echo date('d', (strtotime("{$future}") - strtotime("{$now}")));

检查http://codepad.org/JbaJ3EGH

那时你就可以轻松变身date()了。DateTime还必须从减去的日期中仅获取天、小时、分钟或月,因为将“3 天间隔”格式化为日期会导致“1970-01-01 00:00:00.000”日期...

于 2012-12-10T10:44:04.147 回答
0

知道在 DaveRandom 的非常有用的答案中,从返回的值floor()是浮点数(双精度值)可能很有用,所以

$h === 1 ? true : false;

即使var_dump($h)打印也会返回 false 1

如果您需要检查值是否为整数(例如,在创建具有单数和复数版本的时间单位的字符串时需要检查值是否为 1 或大于 1),请在分配它们时将它们转换为整数:

$h = (int) floor($diff / 3600);

于 2013-11-17T01:47:41.747 回答