首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个记录的时间戳操作

多个记录的时间戳操作
EN

Stack Overflow用户
提问于 2016-12-06 14:51:26
回答 1查看 47关注 0票数 0

我试图计算每个用户的小时数。一个用户每天可以签入和退房多次。

除了入住和退房外,我还有两个(生意和私人)。

如果用户在最后一次签出到最后一次签入之间有同一天的事件业务,最后一次退房到最后一次签入之间的时间将被视为工作时间。

如果他在退房后有一个业务事件作为最后记录,它将计算时间(签出时间-签入+业务= 8)。

在表中,我为每个用户记录事件的位置。

案例1

代码语言:javascript
复制
ID       USERID             TIME               COMMAND

1         1          2016-11-29 08:00:00       CHECK_IN
2         1          2016-11-29 10:05:14       CHECK_OUT
3         1          2016-11-29 12:22:14       BUSINESS
4         1          2016-11-29 13:32:14       CHECK_IN
5         1          2016-11-29 16:00:00       CHECK_OUT

根据上表,我应该让那个用户在特定的一天总共有8个工作小时。

案例2

代码语言:javascript
复制
ID       USERID             TIME               COMMAND

1         1          2016-11-29 08:00:00       CHECK_IN
2         1          2016-11-29 10:05:14       CHECK_OUT
3         1          2016-11-29 12:22:14       PRIVATE
4         1          2016-11-29 13:32:14       CHECK_IN
5         1          2016-11-29 16:00:00       CHECK_OUT

在上述情况下,上一次结帐(ID2)到最后一次签入(ID3)之间的时间在工作时间内不算在内。

我正在努力制作脚本来计算每个员工在月中的每一天的工时。

我在如何用最近的CHECK_OUT减去CHECK_IN时间方面有困难,当用户有一天的多条记录时,就会出现这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 20:28:38

我现正研究以下假设:

  • 工作时间从不跨越日历日
  • 一天的第一个记录总是CHECK_IN,除非那一天的唯一记录是商业或私人的。
  • CHECK_IN记录总是在它之后有一个CHECK_OUT记录,在CHECK_IN和下一个CHECK_OUT之间没有其他记录。
  • 在CHECK_OUT和下一个CHECK_IN之间只能有业务记录或私有记录(或者两者都不能)。两者不能兼而有之。
  • 我忽略了任何可能的日光节约影响
  • 我假设$entries是一个数组,其中包含一个用户的行,为期一天。
代码语言:javascript
复制
function getTimeWorkedFromEntries($entries)
{
    $timeWorked = 0;
    $lastTimeIn = null;
    $lastTimeOut = null;
    $lastEntry = null;

    // the case where the only entry that day is 'BUSINESS'
    if(count($entries) == 1 && $entries[0]['COMMAND'] == 'BUSINESS')
    {
        $timeWorked = 28800; // 8 hours
    }
    else
    {
        foreach($entries as $timeEntry)
        {
            // first check_in of the day
            if($timeEntry['COMMAND'] == 'CHECK_IN' && is_null($lastTimeOut))
            {
                $lastTimeIn = $timeEntry['TIME'];
            }
            // CHECK_IN following a CHECK_OUT and then a BUSINESS
            else if($timeEntry['COMMAND'] == 'CHECK_IN' && !is_null($lastTimeOut) && $lastEntry['COMMAND'] == 'BUSINESS')
            {
                $timeWorked += (strtotime($timeEntry['TIME']) - strtotime($lastTimeOut));
                $lastTimeIn = $timeEntry['TIME'];
            }
            else if($timeEntry['COMMAND'] == 'CHECK_IN')
            {
                $lastTimeIn = $timeEntry['TIME'];
            }
            // CHECK_OUT that follows a CHECK_IN
            else if($timeEntry['COMMAND'] == 'CHECK_OUT')
            {
                $timeWorked += (strtotime($timeEntry['TIME']) - strtotime($lastTimeIn));
                $lastTimeOut = $timeEntry['TIME'];
            }

            $lastEntry = $timeEntry;
        }
    }

    return $timeWorked;
}

实例化

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40998182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档