PHP:错误的时间计算

时间:2018-09-22 07:11:11

标签: php datetime time

我正在研究一个项目,并编写了一个函数来添加两个不同的时间。时间以字符串形式存储在数据库中。

我是

  • 从数据库中提取值
  • 使用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));

请告诉我,以上代码有什么问题以及如何解决?

谢谢

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");

其他详细信息:

  • G和H 一小时的24小时格式(带或不带前导零)
  • i 分钟,前导零为00到59

答案 1 :(得分:1)

您的问题是因为strtotime返回自Unix Epoch(1970年1月1日)以来的秒数。因此,您得到的不是605的值,而是更像15375708001537567500的值。当将这两个值加在一起时,最终的日期会是将来的很远,实际上是一个随机时间。为了弥补这一点,您需要在一天开始时减去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);