如何计算俩个时间的时间差?其中不含包含某个时间段
计算俩个时间差,其中不包含晚上十点之后到早上十点之前的时间段,用php该怎么实现呢?
比如第一个是昨天晚上九点,第二个时间是今天早上11点。则这俩个时间差是2俩个小时
有没有大佬有好的算法呢?(只需要考虑临近俩天的情况,可以都是当天,或者昨天和今天)
ps:我是有个订单需要超时自动取消。但是晚上10点到早上10点不算在内。因为这个时间段,用户没有时间处理订单,情有可原。但是在大白天超过5个小时没有操作就自动取消
直接一点:
分别将开始时间 / 结束时间 和 对应日期的 A/B 对比,比 A 小,取 A,比 B 大;
然后计算
将三者相加即可 a+b+c 注意: 如果 开始时间和结束时间在同一天,c 是负数
优化了一下 ,不知道是否还有优化空间
被排除晚上十点之后到早上十点之前的时间段有12小时
carbon的diff方法可以算两个时间的差值,有个参数,可以使其返回时间差的绝对值,或者带正负号。
订单创建不付款,5小时自动取消,可以使用延迟任务
创建订单时,下单时间+5小时看有没有超过晚十点,如果没有就以这个时间为取消时间,如果超过,就减去晚十点,把剩余时间加到早上10点,作为取消订单的时间,设置延迟任务,如果执行时订单未支付,订单超时取消。
不包括晚上22点到早上10点,说明开始时间和结束时间是不在这个时间段的。
可以使用 PHP 中的 DateTime 类来计算时间差,并在计算时排除晚上十点之后到早上十点之前的时间段。以下是示例代码:
在上面的代码中,首先设置了时区为亚洲/上海(Asia/Shanghai),然后创建了两个时间对象 $start 和 $end,分别表示昨天晚上 9 点和今天早上 11 点。接下来,通过获取 $start 和 $end 的小时数,判断是否需要排除晚上十点之后到早上十点之前的时间段。如果 $start 的小时数大于等于 22,说明此时间在晚上十点之后,需要将其调整为第二天凌晨零点;如果 $end 的小时数小于 10,说明此时间在早上十点之前,需要将其调整为昨天晚上十二点。最后,使用 DateTime 对象的 diff 方法计算时间差,并输出小时数。
需要注意的是,上述代码只能计算临近两天的情况,如果需要计算更长时间跨度的情况,可能需要进行额外的处理。
PS:答案来自 AI
说个思路,就当一天只有十二个小时,输入时间不在正确时间区间内的,就修正到 早上10 点,然后计算就好了。
起止时间在同一天的就直接算差值:end_time - start_time
起止时间不在同一天的就:(end_date - start_date -1)*12 +(start_time 到 start 当天的结束时间的时间间隔)+(end 当天开始时间 到 end_time 的时间间隔)