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

Posted

技术标签:

【中文标题】以 hh:mm:ss 格式表示的两个日期之间的碳时间差【英文标题】:Carbon Difference in Time between two Dates in hh:mm:ss format 【发布时间】:2016-02-08 02:22:07 【问题描述】:

我试图弄清楚如何获取存储在我们数据库中的两个日期时间字符串并将其转换为时间格式的差异 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

【问题讨论】:

仅供参考,$totalDuration = $finishTime->diffForHumans($startTime, true); dd($totalDuration); 应该返回“21 秒”。我知道这仍然不是您正在寻找的格式,但这就是您删除问题中提到的“之后”和“之前”等内容的方式。 【参考方案1】:

我最终使用 Carbon 获得了总秒数差异:

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

然后用gmdate

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

如果有人有更好的方法,我会很感兴趣。否则这行得通。

【讨论】:

我能想到的唯一其他方法是$finishTime->diff($startTime)->format('%H:%i:%s'); 如果日期有不同的日子(例如 1 月 1 日和 1 月 5 日),这些都不起作用。 我已经跨日期(不同的日子)测试了这个解决方案并且它有效。谢谢 mtpultz。 仅在 diffInSeconds floor($totalDuration / 3600) . gmdate(":i:s", $totalDuration % 3600) 获得 > 24 小时的持续时间,例如72:16:12(72 小时 16 分 12 秒)。 @Alex 查看我对适用于不同日子的解决方案的回答【参考方案2】:
$finishTime->diff($startTime)->format('%H:%I:%S');
// 00:00:21

【讨论】:

【参考方案3】:
$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');

以 24h 为模数给出差异

02:00:06

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

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

给出:

26:00:06

【讨论】:

24 小时以上的解决方案在 24 小时内也能正常工作吗?我的情况是差异可以是两者,即少于或多于 24 小时

以上是关于以 hh:mm:ss 格式表示的两个日期之间的碳时间差的主要内容,如果未能解决你的问题,请参考以下文章

Java:以“hh:MM:ss a”格式获取时间[重复]

将系统日期添加到DataStage转换器,格式为“mm / dd / yyyy hh:mm:ss”

无法从格式“yyyy-MM-dd'T'HH:mm:ss+00:00”创建日期

mysql time类型

将日期解析为 yyyy-MM-dd HH:mm:ss 格式 [重复]

如何从日期格式“yyyy-MM-dd'T'HH:mm:ss.SSSZ”中分别获取日期、年份、小时、分钟?