首页 > 解决方案 > 如何在laravel中添加来自数据库的时间

问题描述

[
  {"duration":"00:01:46"},
  {"duration":"00:01:23"}, 
  {"duration":"00:01:56"},
  {"duration":"00:03:20"}, 
  {"duration":"00:05:41"},
  {"duration":"00:02:08"}
]
[
  {"duration":"00:01:32"},
  {"duration":"00:03:31"}, 
  {"duration":"00:05:56"},
  {"duration":"00:03:56"}, 
  {"duration":"00:03:47"},
  {"duration":"00:03:38"},
  {"duration":"00:02:26"}
]

这是来自我的数据库列持续时间的持续时间,现在我想添加/总和这些,以便我可以显示它。

标签: phplaravel

解决方案


使用 DateTime,它的 add 方法与 DateInterval。

<?php

$a = '[
  {"duration":"00:01:46"},
  {"duration":"00:01:23"}, 
  {"duration":"00:01:56"},
  {"duration":"00:03:20"}, 
  {"duration":"00:05:41"},
  {"duration":"00:02:08"}
]';

$b = '[
  {"duration":"00:01:32"},
  {"duration":"00:03:31"}, 
  {"duration":"00:05:56"},
  {"duration":"00:03:56"}, 
  {"duration":"00:03:47"},
  {"duration":"00:03:38"},
  {"duration":"00:02:26"}
]';

$dataA = json_decode($a);

$dataB = json_decode($b);

function sum(array $data): string {
  $sum = new DateTime('00:00');
  $start = new DateTime('00:00');
  foreach ($data as $row) {
    $parts = explode(':', $row->duration);
    $start->add(new DateInterval(sprintf('PT%sH%sM%sS', $parts[0], $parts[1], $parts[2])));
  }

  return $start->diff($sum)->format('%H:%I:%S');
}

var_dump(sum($dataA));
var_dump(sum($dataB));

输出:

string(8) "00:16:14"
string(8) "00:24:46"

注意:如果您的持续时间总和超过 24 小时,您还必须显示天数。


推荐阅读