php 跨天 时间差 秒,判断时间是否在预设跨天时段

开发工作中,很多时候我们会遇到按时段执行不同处理策略的需求。

同天的时段很好处理,直接判断就行了,但跨天我们就需要处理一下了。

我们可以将一天的时间视做一个集合:

如果按秒,则是{0,1,2,3,...(3600*24-1)} 注(3600*24和0是同一时刻)

如果按格式化时分,则是{0,1,2,3,...2359} 注(2400和0是同一时分)

这里按{0,1,2,3,...23}为全集来解析(规则描述范围均使用含头不含尾)

【同天示例】如果时段规则为1-5点

-- 那么对应的命中集合就是{1,2,3,4},即{1<=x<5},直接判断即可

【跨天示例】如果时段规则为22-3点

-- 那么对应的命中集合就是{22,23,0,1,2},即{x>=22}∪{x<3}

-- 我们可以得到其补集为{x<22}∩{x>=3},即{3<=x<22}

-- 则对(元素是否在此补集)的结果取反就是是否在当前集合

示例代码:

// 时段划分(含头不含尾)

$rules = [

'上午' => '0600-1200',

'下午' => '1200-1800',

'夜晚' => '1800-0600',

];

date_default_timezone_set("Asia/Shanghai");

$Hi = date('Hi', time());

echo '当前时段为' . (getTimeSlot($rules, $Hi)) . PHP_EOL;

echo '当前时段为' . (getTimeSlot($rules, '0500')) . PHP_EOL;

echo '当前时段为' . (getTimeSlot($rules, '0600')) . PHP_EOL;

echo '当前时段为' . (getTimeSlot($rules, '1120')) . PHP_EOL;

echo '当前时段为' . (getTimeSlot($rules, '2012')) . PHP_EOL;

function getTimeSlot($rules, $Hi){

foreach ($rules as $k => $rule){

list($startHi, $endHi) = explode('-', $rule);

if ($startHi == $endHi) throw new Exception('规则不合法');

if ($endHi > $startHi){

if ($startHi <= $Hi && $Hi < $endHi){

return $k;

}

}else{

if (!($endHi <= $Hi && $Hi < $startHi)){

return $k;

}

}

}

return null;

}

c2ed54c99c86

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值