Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP日期时间格式可以工作,但日期间隔格式无法工作_Php_Datetime_Datetime Format_Dateinterval - Fatal编程技术网

PHP日期时间格式可以工作,但日期间隔格式无法工作

PHP日期时间格式可以工作,但日期间隔格式无法工作,php,datetime,datetime-format,dateinterval,Php,Datetime,Datetime Format,Dateinterval,我这里有一些PHP代码,可以计算(并回传)一个持续时间。我有一个if/else来选择如何计算持续时间。根据我的计算方式,在一种情况下,输出的持续时间是DateTime对象,在另一种情况下是DateInterval对象。两者的格式化都在if/else语句之外完成 计算正常,DateTime对象的格式正常,但DateInterval对象的格式已关闭。它在输出时间内显示百分号(例如代码块末尾) $time1=新日期时间($row[0]); $time2=新日期时间($row[1]); 如果($time

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

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

$time1=新日期时间($row[0]);
$time2=新日期时间($row[1]);
如果($time1>$time2){
$twentyFourHours=新日期时间('240000');
$difference=$time1->diff($二十四小时);
$time2->add($difference);
$duration=$time2;//这是一个DateInterval对象
}
否则{
$duration=$time2->diff($time1);//这是一个DateTime对象
}  
echo$duration->格式(“%H:%I”);
回声“
”; echo$row['2']; }
下面是我获得的输出示例(每隔一个持续时间是带有百分号的DateInterval对象):

02:10
2016-06-16

%12:%0
2016-06-16

03:04
2016-06-17

%12:%0
2016-06-17

从DateInterval格式化文档中可以看出,我正确地设置了两位数小时和两位数分钟(“%H:%i”)的格式,但输出结果似乎不是这样。我猜我忽略了一些愚蠢的事情,如果有人能指出我错在哪里,我将不胜感激


非常感谢

我把它放在我的调试器中,并对它进行设置,使$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,我想知道这是否是打字错误所在,您打算在哪里做其他事情?希望有帮助

首先,它的工作原理与您的解释完全不同。为了进行检查,您可以放置调试语句以输出对象类型:

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

echo $duration->format('%H:%I');
echo '<br>';
echo $row['2'];
echo“Type:”,get_class($duration),“
”; echo$duration->格式(“%H:%I”); 回声“
”; echo$row['2'];
所以if块中的代码返回DateTime,而else块中的代码返回DateInterval

出现此问题的原因很简单,就是DateTime和DateInterval具有不同的格式类型,DateInterval确实需要始终使用%符号进行转义,而DateTime使用的格式样式与DateInterval相同


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

感谢您的提醒。我应该试着把它们颠倒过来,在询问之前检查一下。我在这两张照片上都做了打印,我可以发誓这是我说的,但显然不是这样。第二天早上我应该用更清晰的头脑来看待它。我会处理它,这样两种场景输出的对象类型都会与使用条件格式相同,这会让我在以后的工作中陷入困境。谢谢你提供的信息。实际上,我确实想将时间差从time1添加到time2。我把它们调换过来,我认为格式语法是一样的。太好了!很高兴你修好了。
echo 'Type: ', get_class($duration), '<br>';

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