因工作开发需要,需要判断一个时间是否在指定的时间段内,且需要支持判断周几及跨天的情况,因此写了以下这个方法,分享给大家学习使用。
代码如下:
<?php
/**
* 判断时间是否匹配指定时间段
*
* Date: 2017-10-29
* Author: fdipzone
* Version: 1.0
*
* @param Array $config 指定日期时段设定
* @param Int $time 判断的日期时间,默认为当前日期时间
* @return Boolean
*/
function check_time_match($config, $time=null){
$curtime = isset($time)? $time : time();
// 当前周几
$curw = date('w', $curtime);
// 上一天周几
$prew = date('w', $curtime-86400);
// 当前时分
$curhm = date('H:i', $curtime);
// 循环指定日期时段,检查是否匹配
foreach($config as $k=>$v){
// 循环时段
foreach($v['range'] as $t){
list($range, $next_day) = explode(',', $t);
// 获取时段的开始结束时间
list($starttime, $endtime) = explode('-', $range);
// 当天
if($next_day==0){
// 检查周几是否匹配
if(in_array($curw, $v['week'])){
// 检查时间是否匹配
if($curhm>=$starttime && $curhm<=$endtime){
return true;
}
}
// 跨天
}else{
// 检查当天周几是否匹配
if(in_array($curw, $v['week'])){
// 检查当天时间是否匹配,开始时间-当天零点
if($curhm>=$starttime){
return true;
}
}
// 检查上一天周几是否匹配
if(in_array($prew, $v['week'])){
// 检查上一天时间是否匹配,当天零点-结束时间
if($curhm<=$endtime){
return true;
}
}
}
}
}
return false;
}
?>
demo:
<?php
// 指定日期时段设定
$config = array(
array(
'week' => array(1,2,3,4,5), // 周一至周五
'range' => array('08:00-12:00,0', '14:00-18:00,0', '20:00-22:00,0')
),
array(
'week' => array(0,6), // 周六周日
'range' => array('08:00-18:00,0', '20:00-02:00,1'), // 0:不跨天,1:跨天
)
);
// 检查时间是否匹配
$check_time = array(
null, // 当前日期时间,2017-10-29 11:40 周日
'2017-10-23 11:00', // 周一
'2017-10-24 12:01', // 周二
'2017-10-25 19:59', // 周三
'2017-10-26 21:59', // 周四
'2017-10-27 22:00', // 周五
'2017-10-28 12:01', // 周六
'2017-10-28 18:01', // 周六
'2017-10-29 01:59', // 周日
'2017-10-30 01:59', // 周一
'2017-10-30 02:01', // 周一
'2017-10-31 01:59', // 周二
);
foreach($check_time as $time){
var_dump(check_time_match($config, strtotime($time)));
}
?>
输出:
boolean true
boolean true
boolean false
boolean false
boolean true
boolean true
boolean true
boolean false
boolean true
boolean true
boolean false
boolean false