【问题标题】:Convert unix time to DateTime Object : PHP 5.2.X将 unix 时间转换为 DateTime 对象:PHP 5.2.X
【发布时间】:2012-12-10 10:25:42
【问题描述】:

基本上我想获得剩余时间到期。我在 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')));

未提供预期结果。

【问题讨论】:

标签: php date datetime unix-timestamp


【解决方案1】:

因为 PHP 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";

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

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

See it working

【讨论】:

    【解决方案2】:

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

    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”日期...

    【讨论】:

    • 这只适用于少于 1 个月的间隔,并且仍然存在闰秒不准确的情况(尽管我认为这在 5.2 中是不可避免的)
    • @DaveRandom 是的,因此我只得到days 的差异。如果日期超过一个月,则需要获得months 差异,减去月份并获得天数差异。好的,我承认这不是正确的方法,您的回答要好得多!
    • 我不认为有一个“正确”的方法来解决这个问题。你的回答没有错,我也没有批评,我只是指出狡猾计划的缺陷。我的也有缺陷。享受我将赐予你的美味 +1。
    【解决方案3】:

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

    $h === 1 ? true : false;

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2017-07-19
      相关资源
      最近更新 更多