Laravel 5 时间差

5

我有一个应用程序,在登录时记录签到时间,在退出时记录签退时间。

我的表格有IN_TIME和OUT_TIME两列。

这些列中的数据示例:

IN_TIME = 16:06:46

OUT_TIME = 16:08:07

我有一个控制器,它向我的Blade模板文件显示给定人员的所有考勤记录,我想要做的是显示两者之间的时间差。

以下是我的当前代码,目前显示为0:

**Time onsite:** {{ date('G:i', strtotime($attrec->out_time)) - date('G:i', strtotime($attrec->in_time)) }}

为什么我无法获得正确的数字?


请查看Carbon,它已经内置于Laravel中:http://carbon.nesbot.com/docs/#api-humandiff - aynber
我可以在我的视图中使用Carbon吗? - Dev.W
1
@Wolrab 当然可以。 - Bogdan
当然可以。你可以在 Laravel 的任何地方使用它。 - aynber
如果您删除逻辑,只执行 {{ strtotime($attrec->out_time) }},会产生什么结果? - camelCase
@驼峰命名法 目前是1452010087。 - Dev.W
3个回答

7
你正在将时间戳转换为格式化字符串,并尝试计算字符串之间的差异。相反,你应该计算每个datetotime的结果之间的差异(它们返回基本上是秒的UNIX时间戳),然后格式化该结果。
{{ date('G:i', strtotime($attrec->out_time) - strtotime($attrec->in_time)) }}

你也可以通过以下方式使用Carbon

{{ (new Carbon($attrec->out_time))->diff(new Carbon($attrec->in_time))->format('%h:%I') }}

这里使用了继承自 DateTime 的方法 diff,它返回一个 DateInterval 实例。DateInterval::format 的格式化字符与 date 使用的不同。这就是为什么格式化字符串是 %h:%I,它等同于 G:i
上述代码将输出:
0:01

因为您选择了不带前导零的小时格式,并且两个时间戳之间的差异为一分钟(还有一些未显示的剩余秒数,因为它们没有包含在格式化字符串中)。

谢谢@bogdan,我是CARBON的新手!我尝试了你的方法,但是出现了语法错误,意外的')',期望','或';'。 - Dev.W
可能在末尾有一个多余的 ),请尝试删除。 - camelCase
@camelCase 是对的,我的错 :). 那里有一个尾随的)。@Wolrab 我还使用 datestrtotime 提供了另一种解决方案,作为 Carbon 的替代。 - Bogdan

0

在控制器中,您可以编写如下内容

$today_check_in = Carbon::parse($attrec->in_time);
$check_out = Carbon::parse($attrec->out_time);
$duration = $today_check_in->diff($check_out)->format('%H:%I:%S');

输出将会是这样的。 00:02:39


0

我可能错了,但是很可能在date的输出上进行算术运算是未定义的。我不熟悉PHP,但是例如bash会将数字值“0”应用于您尝试添加的任何非数字内容。因此,如果您执行以下操作:

"hello" + 5

你将得到 5。在这种情况下,你将会有两个被评估为 0 的对象,所以它们的和是 0 + 0 = 0

有一个关于 PHP 时间算术的问题 这里,希望它能帮助你找到实现你要求的最佳方式!


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