【问题标题】:Laravel 5 Time DifferenceLaravel 5 时差
【发布时间】:2016-01-05 16:23:47
【问题描述】:

我有一个应用程序,它记录登录时间和退出记录时间。

我的表有 IN_TIME 和 OUT_TIME

这些列中的数据示例:

IN_TIME = 16:06:46

OUT_TIME = 16:08:07

我有一个控制器,它在我的刀片模板文件中显示给定人员的所有出勤情况,我想做的是显示两者之间的时间差。

请看下面我当前显示为 0 的代码

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

我不能得到正确的数字有什么原因吗?

【问题讨论】:

  • 查看已经内置在 laravel 中的 Carbon:carbon.nesbot.com/docs/#api-humandiff
  • 我可以在我的视图中使用碳吗?
  • @Wolrab 当然可以。
  • 当然。你可以在 laravel 的任何地方使用它。
  • 如果你去掉逻辑,只做{{ strtotime($attrec->out_time) }}会产生什么?

标签: php laravel eloquent laravel-5.1


【解决方案1】:

您正在将时间戳转换为格式化字符串并尝试计算字符串之间的差异。相反,您应该计算每个 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 新手!我试过你的方法,但我得到语法错误,意外')',期待','或';'
  • 结尾可能是),尝试删除
  • @camelCase 是对的,我的错 :)。那里有一个尾随)。 @Wolrab 我还使用 datestrtotime 作为 Carbon 的替代解决方案更新了我的答案。
【解决方案2】:

我可能是错的,但可能是在date 的输出上未定义算术运算。我不熟悉 PHP,但例如 bash 会将数值“0”应用于任何不是您尝试添加的数字的东西。所以如果你这样做了

"hello" + 5

您将得到 5。在这种情况下,您将有两个对象评估为 0,给出 0 + 0 = 0

有一个问题Here 解决了PHP 中的时间算术问题。希望这将使您以最佳方式实现您想要的!

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2017-07-08
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多