如何在PHP中按指定星期时段控制内容显示?
实现基于星期时段的内容显示判断逻辑
嘿,我来帮你搞定这个基于星期时段的内容显示判断问题!根据你的需求,我们需要处理两种核心场景:时段在同一个星期内(比如周一到周三),以及跨星期的时段(比如周四到下周三)。下面是具体的实现思路和完整代码:
核心思路
首先,我们需要把星期的英文缩写(比如sun、mon)转换成数字,这样更方便进行大小比较。这里我们约定:sun=0、mon=1、tue=2、wed=3、thu=4、fri=5、sat=6。
然后分两种情况处理判断逻辑:
- 时段在同一周内:当起始星期的数字小于等于结束星期的数字时,比如周日(0)到周三(3)、周一(1)到周五(5)。
- 时段跨周:当起始星期的数字大于结束星期的数字时,比如周四(4)到下周三(3),这时候时段覆盖了从起始日到本周日,再加上下周一到结束日。
完整实现代码
if (file_exists('feeds/ptp-ess_landing.json')) { $data = json_decode(file_get_contents('feeds/ptp-ess_landing.json')); } date_default_timezone_set('America/Toronto'); $arradate = strtolower(date('D')); $nowtime = (int)date('His'); $start_day = $data->select_start_day; $start_time = (int)$data->start_time; $end_day = $data->select_end_day; $end_time = (int)$data->end_time; // 建立星期缩写到数字的映射,方便比较 $dayMap = [ 'sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3, 'thu' => 4, 'fri' => 5, 'sat' => 6 ]; // 转换为数字格式的星期 $currentDay = $dayMap[$arradate]; $startDayNum = $dayMap[$start_day]; $endDayNum = $dayMap[$end_day]; $isInRange = false; // 分两种场景判断是否在时段内 if ($startDayNum <= $endDayNum) { // 场景1:时段在同一周内(比如周日到周三、周一到周五) if ($currentDay > $startDayNum && $currentDay < $endDayNum) { // 当前星期在起始和结束之间,全天生效 $isInRange = true; } elseif ($currentDay == $startDayNum && $nowtime >= $start_time) { // 当前是起始日,且时间不早于起始时间 $isInRange = true; } elseif ($currentDay == $endDayNum && $nowtime <= $end_time) { // 当前是结束日,且时间不晚于结束时间 $isInRange = true; } } else { // 场景2:时段跨周(比如周四到下周三) if ($currentDay >= $startDayNum || $currentDay <= $endDayNum) { // 当前星期在起始日到周日,或者周一到结束日的范围内 if ($currentDay == $startDayNum) { // 当前是起始日,需满足时间不早于起始时间 $isInRange = $nowtime >= $start_time; } elseif ($currentDay == $endDayNum) { // 当前是结束日,需满足时间不晚于结束时间 $isInRange = $nowtime <= $end_time; } else { // 其他日期全天生效 $isInRange = true; } } } // 如果在时段内,输出内容 if ($isInRange) { echo "Its in range"; }
场景验证
我们来对应你给出的场景测试一下逻辑是否正确:
- 场景1:时段为周一8:00至周一18:00,当前为周三。此时起始和结束星期都是1,当前星期是2,不在范围内,所以不生效,符合预期。
- 场景2:时段为周一18:00至周五18:00。周二到周四的任意时间都会生效;周一18:00之后生效;周五18:00之前生效,完全符合需求。
- 场景3:时段为周日18:00至周一18:00。周日18:00之后、周一18:00之前的时间都会生效,正确覆盖需求的时段。
- 场景4:时段为周二18:00至周五18:00,当前为周二21:00。当前是起始日且时间晚于18:00,所以生效,符合预期。
- 场景5:时段为周四18:00至周三18:00。周四18:00之后、周五到周二全天、周三18:00之前的时间都会生效,完美覆盖跨周的时段需求。
内容的提问来源于stack exchange,提问作者flash
相关产品推荐
相关产品推荐

