第一个问题。要温柔。
我正在开发跟踪技术人员在任务上花费的时间的软件。该软件需要增强,以根据星期几和一天中的时间识别不同的计费费率乘数。(例如,“工作日下午 5 点后的时间半。”)
使用该软件的技术人员只需要记录日期、他的开始时间和他的停止时间(以小时和分钟为单位)。该软件有望在速率乘数变化时将时间输入分解为部分。单个时间条目不允许跨越多天。
这是费率表的部分示例。显然,第一级数组键是星期几。第二级数组键表示一天中新乘数开始的时间,并一直运行到数组中的下一个连续条目。数组值是该时间范围的乘数。
[rateTable] => Array
(
[Monday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
[Tuesday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
...
)
用简单的英语来说,这表示从午夜到早上 8 点的时间半费率,从晚上 8 点到下午 5 点的常规费率,以及从下午 5 点到晚上 11:59 的时间半费率。这些中断发生的时间可能是任意的到秒,并且每天可以有任意数量的中断。(这种格式完全可以协商,但我的目标是使其尽可能易于人类阅读。)
例如:星期一从 15:00:00(下午 3 点)到 21:00:00(晚上 9 点)记录的时间条目将包括按 1 倍计费的 2 小时和按 1.5 倍计费的 4 小时。单个时间条目也可以跨越多个中断。使用上面的示例 rateTable,从上午 6 点到晚上 9 点的时间条目将具有 3 个子范围,从上午 6 点到 8 点 @ 1.5x、上午 8 点到下午 5 点 @ 1x 和下午 5 点到晚上 9 点 @ 1.5x。相比之下,时间条目也可能仅从 08:15:00 到 08:30:00 并且完全包含在单个乘数的范围内。
我真的可以使用一些帮助来编写一些 PHP(或至少设计一种算法),这些 PHP 可能需要一周中的一天、开始时间和停止时间,并解析成所需的子部分。理想的输出是一个由(开始、停止、乘数)三元组的多个条目组成的数组。对于上面的示例,输出将是:
[output] => Array
(
[0] => Array
(
[start] => 15:00:00
[stop] => 17:00:00
[multiplier] => 1
)
[1] => Array
(
[start] => 17:00:00
[stop] => 21:00:00
[multiplier] => 1.5
)
)
我只是无法理解将单个(开始,停止)拆分为(可能)多个子部分的逻辑。