【问题标题】:Extract Working/Non-Working Hours With Weekend/Weekday Breakdown For A Working Schedule通过周末/工作日细分提取工作/非工作时间以获取工作时间表
【发布时间】:2022-01-27 09:02:04
【问题描述】:

我的项目确实需要一个计算脚本,它可以在几分钟内为我计算 4 件事。

  • 工作日(08.30 - 17.30 之间)的工作时间分配的总分钟数
  • 工作日非工作时间分配的总分钟数(08.30 - 17.30 除外)
  • 周末工作时间分配的总分钟数(08.30 - 17.30 之间)
  • 周末非工作时间分配的总分钟数(08.30 - 17.30 除外)

基本上,我正在创建和使用日程安排 Google 日历实际上但没关系,我手头只有开始结束的日期时间对象,用于日历上的员工并将日期时间范围分配给员工让他们负责在一定的时间范围内接听客户的电话,这个时间范围也可能持续一周、几个小时、几分钟或几天。这里的问题是这些日期范围非常灵活。

我尝试循环遍历 unix 时间戳,为每个循环创建一个 DateTime 对象并检查这 4 件事,但由于我多次锁定计算机,这会占用过多的内存和 CPU。如果事件最多只能持续一天,我将能够在一天中循环数小时,但它们非常灵活,所以我需要一个强大的算法。

例如,时间表如下所示:

Start(DateTime Object) => 2022-01-27 00:00:00
End(DateTime Object)   => 2022-01-29 13:30:00

该函数应将这两个对象作为参数,并应创建一个输出,如下图所示。应该和这个类似:

function createReport(DateTime $employeeWorkStart, DateTime $employeeWorkEnd) : array {
...
return [
    'weekday_in-working-hours' => XXX,
    'weekday_out-working-hours' => XXX,
    'weekend_in-working-hours' => XXX,
    'weekday_out-working-hours' => XXX,
]

}

所以我需要创建一个每月报告,显示我在日程表中为每位员工分配了多少分钟。

我的工作时间在 08.30 - 17.30 之间,周六和周日被视为周末。 Example Report Output

【问题讨论】:

  • 到目前为止你尝试过什么?你被困在哪里了?
  • 正如我在描述中所分享的,我尝试循环 unix 时间戳整数(知道这是不可能的,但只是想看看)。还尝试为每个时间表循环播放一天中的几个小时,但后来发现一个事件可能持续超过一天并停止了这个想法。所有其他方法都卡住了,我迷失了遵循脚本的方向。

标签: php datetime


【解决方案1】:

因此,目前无法提供实际的代码答案。但我将如何处理它:

  • 获取两个日期之间的天数,减去周末。如果 $employeeWorkEnd 是当天(今天)并且如果您想获得额外的精度,也减去一天。我发现这个要点可以为您提供工作日(周末和节假日除外):https://gist.github.com/quawn/8503445
  • 将其乘以 9(工作时间),然后乘以 60 得到总分钟数。这是总工作时间。
  • 如果您想在第 1 步中获得额外的精度,现在只需计算 09:30 和当前时间之间的分钟差(date_diff 可以提供)。将此差额添加到您目前的总数中。

为您拥有的每位员工执行此程序。上面的过程不会做任何循环,我相信应该可以通过减法和乘法来完成(如果你想使用要点中的代码排除假期,这将引入一个小循环,假设假期数量很少)。

您的示例输出显示小时,但您的描述显示分钟。上面的故事会给你几分钟,但也很容易得到几小时(或毫秒)。

【讨论】:

  • 感谢您的快速回答,我们也非常感谢您的方法。但问题是这并不像我们也在计算它。员工可能没有安排一天的所有工作时间,或者我错过了什么?编辑:假期很好,我不考虑它们。
  • 啊,我不清楚。那么员工每天有灵活的工作时间吗?如果您提供开始日期时间和结束日期时间作为唯一参数,则无法进行此计算。您能否修改您的问题以包含此内容并显示您可用于显示员工当天工作 x 小时的数据?
  • 为了更清楚起见,我在 Google 日历中创建了事件,并为该事件分配了一名员工。当客户在我的网站上填写表格时,我会通过检查为该日期时间范围分配的人员将客户分配给合适的员工。因此,事件可能会持续一个小时、一天或一天​​以上,甚至 15 分钟。没有特定的时段,例如 1 小时或 30 分钟。例如,一个活动可以从上周开始,然后可以在下周四进行,比如说 13.30。我希望能解释它
  • 好的,我越来越接近你想要做的事情了。因此,如果您将参数映射到日历 API (developers.google.com/calendar/api/v3/reference/events/list#php),这将是“timeMin”和“timeMax”参数吗?在这种情况下,您不应该只遍历所有相关事件并获取 timeMin 和 timeMax 之间的差异来获得完整长度。您可以查看时间小时和分钟来确定是否在工作时间之外,您可以使用天数来确定是否在周末。我是暖和了还是还没暖和?
  • 没有。为了清楚起见,我分享了谷歌的东西。想想你有开始结束的日期时间。谷歌日历在这里帮不了我们,我只是用它来获取那些开始结束的日期时间并创建一个数组。正如我之前提到的,事件并不是严格意义上的一两天、三天等。它们按分钟计算是灵活的。员工可以从周三 09.30 开始,并可以在周四 15.00 之后的 2 周结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多