PHP日期时间格式可以工作,但日期间隔格式无法工作
我这里有一些PHP代码,可以计算(并回传)一个持续时间。我有一个if/else来选择如何计算持续时间。根据我的计算方式,在一种情况下,输出的持续时间是DateTime对象,在另一种情况下是DateInterval对象。两者的格式化都在if/else语句之外完成 计算正常,DateTime对象的格式正常,但DateInterval对象的格式已关闭。它在输出时间内显示百分号(例如代码块末尾)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
$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:102016-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'];