PHP计算两个日期之间的办公时间

PHP计算两个日期之间的办公时间,php,time,Php,Time,我们运行的服务基于2个工作日SLA,因此如果请求在周一下午1点提交,则应在周三下午1点之前完成 因此,在数据库中,我有两个MySQL时间戳YYYY/MM/DD HH:MM:SS,并且需要一些方法来计算工作时间中两个日期之间的时间,基于上午9点到下午5点的办公时间 有人能给我一些想法吗?一般来说,给定时间戳A和B,其中A是开始时间: 确定A和B之间的天数(有简单的方法可以做到这一点),称之为D 如果时间戳B的HH:MM:SS大于或等于时间戳A的HH:MM:SS,则添加时间差H,给出D(天)+H(

我们运行的服务基于2个工作日SLA,因此如果请求在周一下午1点提交,则应在周三下午1点之前完成

因此,在数据库中,我有两个MySQL时间戳YYYY/MM/DD HH:MM:SS,并且需要一些方法来计算工作时间中两个日期之间的时间,基于上午9点到下午5点的办公时间


有人能给我一些想法吗?

一般来说,给定时间戳A和B,其中A是开始时间:

  • 确定A和B之间的天数(有简单的方法可以做到这一点),称之为D
  • 如果时间戳B的HH:MM:SS大于或等于时间戳A的HH:MM:SS,则添加时间差H,给出D(天)+H(时间)
  • 如果时间戳B的HH:MM:SS小于A的HH:MM:SS,则从D中减去1,再加上8小时减去时间差H,得到D-1(天)+8(小时)-H
在您的示例中,如果A是周一下午1点,B是周三下午1点,那么D是2。由于时间相同,H为0,因此总差值为2个工作日

如果B是周三下午3点,那么总的差异将是2天加2小时

如果B是星期三上午9点,那么总的差值是1天加4小时


上述方法不处理周末或假日,因此您必须进行适当的修改。

最简单的方法是在数据库中存储一个表,每天一行,包含当天可用的工作时间。这使您能够以高粒度处理假日和周末,并且您可以通过在用户指定的两个日期之间的天数上运行一个总和来获得可用的时间量。

仅通过SQL创建这一点很困难。在MySQL中,时间戳之间的差异可以这样计算

SELECT TIMESTAMPDIFF(HOUR,T.ts2,T.ts1) 
FROM test AS T;
……但ofc不考虑任何办公时间

请记住,SQL不知道您的办公时间,这些也可能依赖于其他因素(周末、银行假期或其他)。为了做到这一点,您必须首先设置一个日历表,然后开始计算

几年前我也遇到过类似的问题,在那里我使用了一个后端脚本,在这个脚本中我定义了时间和假期。然后,我在第一时间插入数据时计算了未来的时间戳,这更容易,也更灵活