PHP DateTime格式化工作但DateInterval格式不起作用

时间:2016-06-24 11:47:47

标签: php datetime datetime-format dateinterval

我在这里有一些PHP代码可以计算(和回声)一段时间。我有一个if / else选择如何计算持续时间。由于我完成计算的方式,在一种情况下,输出的持续时间是DateTime对象,在另一种情况下,它是DateInterval对象。两者的格式化都在if / else语句之外完成。

计算工作正常,并且DateTime对象的格式设置正常,但DateInterval对象的格式设置已关闭。它显示输出时间内的百分号(例如代码块末尾的例子)。

$time1 = new DateTime($row[0]); 
$time2 = new DateTime($row[1]);

if ($time1 > $time2) { 
    $twentyFourHours = new DateTime('240000');
    $difference = $time1->diff($twentyFourHours);
    $time2->add($difference);
    $duration = $time2; // this is a DateInterval object
}

else    {
$duration = $time2->diff($time1);  // This is a DateTime object
        }  

echo $duration->format('%H:%I');
echo '<br>';
echo $row['2'];
    }

下面是我得到的输出示例(每隔一个持续时间是具有百分号的DateInterval对象):

2点10
2016年6月16日

12%:%0
2016年6月16日

03:04
2016年6月17日

12%:%0
2016年6月17日

从DateInterval格式化文档中我可以看出,我正在设置两位数小时和两位数分钟的格式(&#39;%H:%I&#39;),但输出似乎证明除此以外。我猜我忽略了一些愚蠢的事情,如果有人能指出我哪里出错了,我将不胜感激。

非常感谢!

2 个答案:

答案 0 :(得分:2)

我把它放在我的调试器中并进行设置,以便$ time1大于$ time2 2小时10分钟,这看起来像是你的第一个数据集并得到了同样的错误。

在调试器中观察时,$ duration是DateTime对象而不是Duration对象。具体做法是:

$duration = $time2; // this is a DateInterval object

$ time2是一个DateTime对象,因此$ duration成为DateTime对象,因此格式失败。

所以,在你的代码中:

   // find the duration since midnight
   $twentyFourHours = new DateTime('240000');
   $difference = $time1->diff($twentyFourHours);

   // add that difference to time2...hmmm
   $time2->add($difference);

   // copy time2 to duration, this will copy the $time2 DateTime object
   $duration = $time2; // this is a DateInterval object

看起来你正在从午夜获得$ time1的持续时间,然后将它添加到$ time2,我想知道这是否是错字的位置,你打算做别的什么?希望有所帮助!

答案 1 :(得分:1)

首先,它与您的解释完全不同。为了检查,您可以放置​​一个调试语句来输出对象的类型:

echo 'Type: ', get_class($duration), '<br>';

echo $duration->format('%H:%I');
echo '<br>';
echo $row['2'];

因此,if-block中的代码返回DateTime,而else-block中的代码返回DateInterval。

您遇到此问题的原因很简单,DateTime和DateInterval具有不同的格式类型,DateInterval确实需要使用%-sign转义所有formatting symbols,而DateTime使用与{{3}相同的格式样式}。

我看到两种方法来解决问题:简单的方法就是引入一个存储必要格式的变量并将其设置为if和else块中的相应值,另一种方式 - 重写代码以使$ duration变量两种情况都有相同的类型。