两个日期之间的时间差以hh:mm:ss格式表示的碳差异

98

我想找出如何将存储在我们数据库中的两个日期时间字符串转换为hh:mm:ss时间格式的差异。

我查看了diffForHumans,但它不能给出我想要的格式,而是返回诸如afterago等内容;这对我有用,但不是我试图做的。

这段时间永远不会跨越几天,最多只有几个小时。

$startTime = Carbon::parse($this->start_time);
$finishTime = Carbon::parse($this->finish_time);

$totalDuration = $finishTime->diffForHumans($startTime);
dd($totalDuration);

// Have: "21 seconds after"
// Want: 00:00:21

2
FYI, $totalDuration = $finishTime->diffForHumans($startTime, true); dd($totalDuration); 应该返回“21秒”。我知道这仍然不是你想要的格式,但这就是如何去除像“after”和“ago”这样的内容,正如你在问题中提到的。 - willjohnathan
5个回答

134

我最终使用Carbon计算出了总秒数差:

$totalDuration = $finishTime->diffInSeconds($startTime);
// 21

然后使用了gmdate:

gmdate('H:i:s', $totalDuration);
// 00:00:21

如果有更好的方式,我会很感兴趣。否则这个方法也可以。


43
我唯一能想到的方式是 $finishTime->diff($startTime)->format('%H:%i:%s'); - Thomas Kim
5
如果日期不同,这些方法都无法奏效(例如1月1日和1月5日)。 - Alex
我已经测试了这个解决方案,跨越不同日期(不同的天数),它可以工作。感谢mtpultz。 - mcmacerson
3
仅当 diffInSeconds < 86400 (24小时) 时才有效。使用 floor($totalDuration / 3600) . gmdate(":i:s", $totalDuration % 3600) 来获取大于 24 小时的持续时间,例如 72:16:12(72小时,16分钟,12秒)。 - M165437
@Alex,请查看我的答案,这是适用于不同天数的解决方案。 - Adam

59
$start  = new Carbon('2018-10-04 15:00:03');
$end    = new Carbon('2018-10-05 17:00:09');

您可以使用

$start->diff($end)->format('%H:%I:%S');

将给出模24小时的差异。

02:00:06

如果您想要超过24小时的差异,您可以使用:

$start->diffInHours($end) . ':' . $start->diff($end)->format('%I:%S');

给出:

26:00:06


解决方案对于超过24小时的时间差是否也适用于少于24小时的情况?我的场景是时间差可以是小于或大于24小时。 - Tab Key
@TabKey 是的,它适用于两种情况。 - Adam
太好了,非常感谢你,兄弟! - Abed Putra

58
$finishTime->diff($startTime)->format('%H:%I:%S');
// 00:00:21

7
我知道这是一个老问题,但当搜索这种类型的问题时,它仍然位居谷歌搜索结果的前列,并且Carbon增加了很多灵活性,因此我也想在这里提供一个2022年的解决方案。
简而言之,请查看不同/更详细版本的diffForHumans方法的文档,以及对options有更大的控制权。 例如,我们需要显示两个Carbon实例(startend)之间的小时和分钟差异,但是它们可能相差超过24个小时,在这种情况下,分钟变得不那么重要。我们想排除“ago”,还想用逗号连接字符串。
我们可以通过传递给diffForHumans$options来实现所有这些,如下所示:
use Carbon\CarbonInterface;

$options = [
  'join' => ', ',
  'parts' => 2,
  'syntax' => CarbonInterface::DIFF_ABSOLUTE,
];

return $end->diffForHumans($start, $options);

这将导致类似于“持续时间”列中所看到的值:

希望对某些人有所帮助!

该问题明确要求 hh:mm:ss 格式,而此答案未提供。 - miken32

2
您可以使用Carbon包按照以下方式获取时间差:
$start_time = new Carbon('14:53:00');
$end_time = new Carbon('15:00:00');
$time_difference_in_minutes = $end_time->diffInMinutes($start_time);//you also find difference in hours using diffInHours()

1
问题明确要求 hh:mm:ss 格式,而这个答案并没有提供。 - miken32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接