我正在研究一个项目,并编写了一个函数来添加两个不同的时间。时间以字符串形式存储在数据库中。
我是
strtotime
将其转换为时间date
函数添加时间这是我的代码:
$time_1 = '1:00';
$time_2 = '0:05';
//should be 1:05, whereas it prints 04:05
echo date("H:i", strtotime($time_1) + strtotime($time_2));
请告诉我,以上代码有什么问题以及如何解决?
谢谢
答案 0 :(得分:1)
使用DateTime::createFromFormat功能,并从Adding two DateTime objects in php中吸取灵感
$time_1 = '1:00';
$time_2 = '0:05';
$t1 = DateTime::createFromFormat('G:i', $time_1);
$t2 = DateTime::createFromFormat('G:i', $time_2);
$interval1 = $t1->diff(new DateTime('00:00:00')) ;
$interval2 = $t2->diff(new DateTime('00:00:00')) ;
$e = new DateTime('00:00');
$f = clone $e;
$e->add($interval1);
$e->add($interval2);
$total = $f->diff($e)->format("%H:%I:%S");
其他详细信息:
答案 1 :(得分:1)
您的问题是因为strtotime
返回自Unix Epoch(1970年1月1日)以来的秒数。因此,您得到的不是60
和5
的值,而是更像1537570800
和1537567500
的值。当将这两个值加在一起时,最终的日期会是将来的很远,实际上是一个随机时间。为了弥补这一点,您需要在一天开始时减去strtotime
的值,以使第二次成为相对时间,例如:
echo date("H:i", strtotime($time_1) + strtotime($time_2) - strtotime('00:00'));
输出:
01:05
更新
由于事实证明两次的总和可以超过,因此上述代码将不起作用(在移至{之前,其显示的最长时间为23:59
{1}},因此有必要将这两种时间都转换为相对于一天开始的相对分钟数,将它们相加,然后显示为小时和分钟:
00:00
输出:
$time_1 = '12:00';
$time_2 = '14:30';
$time_sum = (strtotime($time_1) + strtotime($time_2) - 2 * strtotime('00:00')) / 60;
printf('%02d:%02d', intdiv($time_sum, 60), $time_sum % 60);