gpt4 book ai didi

php - 多条记录的时间戳操作

转载 作者:行者123 更新时间:2023-11-29 07:07:48 25 4
gpt4 key购买 nike

我正在尝试计算每个用户的小时数。一名用户每天可以多次 checkin 和 checkout 。

除了“入住”和“退房”事件之外,我还有两个事件(商务和私有(private))。

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

如果他在 CHECK OUT 后有一个商务事件作为最后记录,则会计算小时数(CHECK OUT 时间 - CHECK IN + BUSINESS = 8)。

在表中,我有地方记录每个用户的事件。

案例1

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

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

在上述情况下,上次结账 (ID 2) 和上次入住 (ID 3) 之间的时间不计入工作时间。

我正在尝试编写脚本来计算每个员工每月每一天的工作时间。

我在如何用最接近的 CHECK_IN 减去 CHECK_OUT 时间时遇到了麻烦,当用户一天有多个记录时就会出现该问题。

最佳答案

我正在研究以下假设:

  • 工作时间从不跨日历日
  • 当天的第一条记录始终为 CHECK_IN,除非当天唯一的记录是 BUSINESS 或 PRIVATE
  • 一条 CHECK_IN 记录后面始终有一条 CHECK_OUT 记录,且在 CHECK_IN 和下一条 CHECK_OUT 之间没有其他记录
  • 在 CHECK_OUT 和下一个 CHECK_IN 之间只能有 BUSINESS 记录或 PRIVATE 记录(或两者都没有)。不可能两者兼而有之。
  • 我忽略夏令时的任何潜在影响
  • 我假设 $entries 是一个数组,其中包含一个用户一天的行
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;
}

Live Example

关于php - 多条记录的时间戳操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40998182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com