【问题标题】:How to calculate hours before and after midnight between 2 timestamps如何计算两个时间戳之间午夜前后的小时数
【发布时间】:2019-01-28 22:38:43
【问题描述】:

我正在开发一个时钟应用程序。

当员工打卡时,当前日期和时间将保存为分配给变量 $clockin_time 的时间戳。当员工下班时,当前日期和时间将保存为分配给变量 $clockout_time 的时间戳。然后我使用一些数学来计算两个时间戳之间的持续时间,以查看该员工在时钟输入时间和时钟输出时间之间工作了多长时间。所有这些工作正常。

我们公司的发薪期从一周的周四到下周的周四,因此周四午夜是当前发薪期的截止日期。但是,我们有员工从晚上 7 点到凌晨 5 点在墓地工作。如果员工在周三晚上 7 点到周四早上 5 点工作,则应将午夜之前的所有工作时间添加到其上一个支付周期,并将午夜之后的所有工作时间添加到下一个支付周期。

我的问题是,如果员工在周三晚上上班,周四早上下班,并且我有他们的开始时间和结束时间作为时间戳,我如何计算出他们周三工作了多少小时以及多少小时他们星期四上班吗?

【问题讨论】:

  • 你有没有尝试写任何东西来解决这个问题? SO 不是免费的咨询服务。

标签: php mysql datetime timestamp


【解决方案1】:

你一定要检查https://carbon.nesbot.com/docs/

来自文档的小例子:

$mutable = Carbon::now();
$immutable = CarbonImmutable::now();
$modifiedMutable = $mutable->add(1, 'day');
$modifiedImmutable = CarbonImmutable::now()->add(1, 'day');

var_dump($modifiedMutable === $mutable);             // bool(true)
var_dump($mutable->isoFormat('dddd D'));             // string(11) "Saturday 26"
var_dump($modifiedMutable->isoFormat('dddd D'));     // string(11) "Saturday 26"
// So it means $mutable and $modifiedMutable are the same object
// both set to now + 1 day.
var_dump($modifiedImmutable === $immutable);         // bool(false)
var_dump($immutable->isoFormat('dddd D'));           // string(9) "Friday 25"
var_dump($modifiedImmutable->isoFormat('dddd D'));   // string(11) "Saturday 26"
// While $immutable is still set to now and cannot be changed and
// $modifiedImmutable is a new instance created from $immutable
// set to now + 1 day.

$mutable = CarbonImmutable::now()->toMutable();
var_dump($mutable->isMutable());                     // bool(true)
var_dump($mutable->isImmutable());                   // bool(false)
$immutable = Carbon::now()->toImmutable();
var_dump($immutable->isMutable());                   // bool(false)
var_dump($immutable->isImmutable());                 // bool(true)

【讨论】:

    【解决方案2】:

    如果你打算在 MySQL 中这样做,那么:

    select timestampdiff(hour, clockout_time, clockin_time)
    from work_sessions;
    

    以小时为单位为您提供差异。让我们进一步解决这个问题:

    select timestampdiff(hour, clockout_time, date(clockout_time)) as aftermidnight, timestampdiff(hour, date(clockout_time), clockin_time)
    from work_sessions;
    

    我没有对此进行测试,因此,如果这为您提供了小时的整数值,那么您可以通过传递分钟而不是小时来提高精度,然后进行计算。

    在 PHP 中,假设您有两个日期时间,$clockinTime$clockoutTime,那么

    $diff = $clockoutTime->diff($clockinTime);
    

    计算差值。

    $totalHours = $diff->h;
    

    将为您提供总小时数。

    $afterMidnight = date('H', $date);
    $beforeMidnight = $totalHours - $afterMidnight;
    

    你有以小时为单位的距离。

    注意,我没有测试任何这段代码,所以如果你遇到问题,请告诉我。

    【讨论】:

    • 我不明白 :-(
    • @Strawberry 如果不清楚,我很乐意编辑我的答案,但我需要您的指导来解释这个答案的哪一部分需要澄清。
    • @Lajos,我尝试使用输入的值运行 PHP,当我收到 FATAL ERROR Uncaught Error: Call to a member function diff()
    • @D.Oakley ->diff 是 DateTime 的函数。请查看文档中的页面:php.net/manual/en/datetime.diff.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多