PHP适配任意跨零点时段执行的代码问题求助(用于暗黑模式)
PHP实现跨零点的暗黑模式定时切换方案
你的原代码逻辑错误在于:当时段跨零点(如22:00至次日08:00)时,$hour > 22 && $hour < 8这个条件永远无法成立——一个小时值不可能同时大于22且小于8。以下是适配任意24小时时段(含跨零点场景)的解决方案:
核心逻辑
时段分为两种情况处理:
- 不跨零点(如10:00-18:00):直接判断当前小时是否在开始和结束小时之间
- 跨零点(如21:00-08:00、22:00-03:00):判断当前小时大于等于开始小时(当天晚段),或者小于等于结束小时(次日凌晨)
基础实现代码
// 获取当前小时(转为整数,避免字符串比较误差) $current_hour = intval(date('H')); // 自定义目标时段:24小时制的开始/结束小时 $start_hour = 22; $end_hour = 8; // 判断是否处于暗黑模式时段 $enable_dark_mode = false; if ($start_hour <= $end_hour) { // 时段未跨零点(如9:00-17:00) $enable_dark_mode = ($current_hour >= $start_hour && $current_hour <= $end_hour); } else { // 时段跨零点(如22:00-08:00) $enable_dark_mode = ($current_hour >= $start_hour || $current_hour <= $end_hour); } // 实际业务逻辑:切换暗黑模式 if ($enable_dark_mode) { echo "Good night"; // 这里替换为开启暗黑模式的代码(如添加CSS类、加载暗黑样式) } else { echo "Good Morning"; // 替换为关闭暗黑模式的代码 }
可复用函数封装
如果需要在多处调用时段判断逻辑,可以封装成函数:
/** * 判断当前时间是否在指定24小时时段内 * @param int $start_hour 开始小时(0-23,24小时制) * @param int $end_hour 结束小时(0-23,24小时制) * @return bool */ function is_in_target_time_range(int $start_hour, int $end_hour): bool { $current_hour = intval(date('H')); return $start_hour <= $end_hour ? ($current_hour >= $start_hour && $current_hour <= $end_hour) : ($current_hour >= $start_hour || $current_hour <= $end_hour); } // 使用示例 // 场景1:跨零点时段(21:00-08:00) if (is_in_target_time_range(21, 8)) { // 开启暗黑模式 } // 场景2:不跨零点时段(14:00-19:00) if (is_in_target_time_range(14, 19)) { // 执行对应时段逻辑 }
注意事项
- 务必将小时转为整数后比较,避免字符串比较的潜在问题(例如
'08'和'8'的字符串比较结果不符合预期) - 该方案支持任意24小时制时段配置,无需额外处理跨天逻辑
- 实际项目中,可将
$enable_dark_mode的结果用于控制页面样式类、加载不同样式文件等操作
内容的提问来源于stack exchange,提问作者alex dev
相关产品推荐
相关产品推荐

