PHP+MySQL实现酒吧电子菜单跨天欢乐时段产品展示方案
解决酒吧跨天时段菜单展示的判断逻辑
这个问题在做餐饮类时段性功能时特别常见,我来给你梳理清晰的解决方案:
核心逻辑拆分
我们可以把时段分成两种情况处理:
- 非跨天时段(开始时间 ≤ 结束时间):比如12:00-20:00,用你原本的判断逻辑就完全没问题:
startTime ≤ currentTime AND endTime ≥ currentTime - 跨天时段(开始时间 > 结束时间):比如20:00-次日03:00,这时候当前时间只要满足「在开始时间到当天结束」或者「在当天开始到结束时间」,就算在时段内,对应的逻辑是:
currentTime ≥ startTime OR currentTime ≤ endTime
通用合并公式
把两种情况整合起来,就能得到一个适用于所有时段的判断公式:
(startTime <= endTime AND currentTime >= startTime AND currentTime <= endTime) OR (startTime > endTime AND (currentTime >= startTime OR currentTime <= endTime))
代码示例(以JavaScript为例)
如果你的菜单是前端实现,我们可以把时间转换为「当日总秒数」(比如12:00:00就是123600=43200秒,03:00:00就是33600=10800秒),这样计算更精准:
// 把时间字符串(如"12:00:00")转成当日总秒数 function timeToSeconds(timeStr) { const [hours, minutes, seconds] = timeStr.split(':').map(Number); return hours * 3600 + minutes * 60 + seconds; } // 判断当前时间是否在目标时段内 function isProductAvailable(currentTimeStr, startTimeStr, endTimeStr) { const currentSec = timeToSeconds(currentTimeStr); const startSec = timeToSeconds(startTimeStr); const endSec = timeToSeconds(endTimeStr); if (startSec <= endSec) { return currentSec >= startSec && currentSec <= endSec; } else { // 跨天场景 return currentSec >= startSec || currentSec <= endSec; } } // 测试用例 console.log(isProductAvailable("15:00:00", "12:00:00", "20:00:00")); // true(非跨天) console.log(isProductAvailable("22:30:00", "20:00:00", "03:00:00")); // true(跨天,22:30在20:00-24:00之间) console.log(isProductAvailable("02:15:00", "20:00:00", "03:00:00")); // true(跨天,02:15在00:00-03:00之间) console.log(isProductAvailable("10:00:00", "20:00:00", "03:00:00")); // false(不在时段内)
额外提示
如果是后端处理(比如Python、Java),逻辑完全一致,只是时间转换的语法不同而已——核心都是先把时间统一转换成可比较的数值(秒数、时间戳等),再套用上述的判断逻辑。
内容的提问来源于stack exchange,提问作者studio-klik
相关产品推荐
相关产品推荐

