0

我正在尝试创建一个函数来计算两次之间的时间差,但只包括工作时间。这适用于跟踪完成工作所需时间的项目。

工作时间为周一至周五上午 9 点至下午 5 点。

  • 示例 1
    如果作业从下午 4:50 开始,并且有人在第二天上午 10 点查看该页面,则计时器将显示 1h 10m 0s。
  • 示例 2
    如果作业在下午 6:23 开始,并且有人在第二天上午 9:30 查看页面,则计时器将显示 30m 0s。
  • 示例 3
    如果工作在星期五下午 1:20 开始,并且有人在下午 4 点查看非星期二的页面,则计时器将显示 18h 40m 0s。(不包括周六和周日!)
4

1 回答 1

1

这可能有点压倒性,但在链接中@Amine Matmati 提供了您需要的所有工具。有了它,您可以轻松地浏览从开始时间戳到现在的每一天,并跳过周末和下班时间。

这有点笨拙,但它会工作。

strtotime(str, timestamp)接受一个字符串,该字符串几乎是简单的英语命令,如果需要,还需要一个参考时间戳。这就是您从当前时间戳一直运行到结束时间戳的方式。

IE。strtotime('end of the working day', timestamp of when the job started);

[注意:'end of the day' 不是一个可接受的字符串,请查看底部 PHP 手册的链接,我只是想让你看看它对你有什么用处]

因此,如果您构建了一个从原始时间戳到现在的循环,您可以计算您所走的工作小时数。

我将向您展示伪代码中的逻辑:

$Present is present timestamp;
$Start is the starting timestamp;
$Hours will be the accumulated working hours between starting timestamp and present timestamp;

loop while present timestamp not reached {

if $Start does not occur on the same day as $Present{
  if $Start occurs inside of working hours {
    find the time to the end of the working day;
    add that time to $Hours;
  }

  find next day;
  if the next day is Saturday{
    update $Start to the working start of next Monday;
  }
  else{
    update $Start to the working start of the next day;
  }
}
else{
  find the time between $Start and $Present;
  add that time to $Hours;
  update $Start to $Present or Break;
  }
}

它确实假设开始时间不会出现在周末,并且不会出现在与当前时间戳同一天的工作时间之外(即之前),但控制这些非常容易。

在这方面将成为您朋友的事情是:

@Amine Matmati 的链接:忽略周末时间的两个日期之间的时差

PHP 日期():http://php.net/manual/en/function.date.php
PHP strtotime():http ://www.php.net/manual/en/function.strtotime.php

快乐编码!

于 2013-02-19T15:27:59.277 回答