如何在自定义奇幻日期系统中判断当前时刻是否处于店铺营业时间(含跨午夜场景)
如何在自定义奇幻日期系统中判断当前时刻是否处于店铺营业时间(含跨午夜场景)
嘿,我完全懂你碰到的这个麻烦——跨午夜的营业时间判断确实容易绕晕,尤其是在自己写的奇幻日期系统里。咱们先把问题拆解开,再一步步修正你的代码逻辑。
首先,核心问题很明确:
- 当营业时间是同一天内(比如8:00-18:00),直接判断当前小时在区间里就行;
- 当营业时间跨午夜(比如20:00-次日2:00),本质是两个时间段的结合:当天的20:00到24:00,加上次日的0:00到2:00。
你的代码里的问题出在else分支的判断逻辑上,咱们来调整一下:
场景1:每日重复的营业时间(不关心具体日期,只看小时)
如果店铺是每天固定时间段营业(比如每天8-18,或每天20到次日2),那判断逻辑非常简单,不用纠结日期,只看当前小时:
int HourFrom = 18; // 店铺开始营业的小时 int HourTo = 8; // 店铺结束营业的小时 bool hasOpen = false; AventurienDate now; now.set(1025, 4, 26, 1); // 当前时刻:1025年4月26日1点 if (HourFrom <= HourTo) { // 不跨天的情况:比如8-18,当前小时在[HourFrom, HourTo]之间就营业 hasOpen = (now.Hours >= HourFrom) && (now.Hours <= HourTo); } else { // 跨天的情况:比如18-8,当前小时 >=18 或者 <=8 就营业 hasOpen = (now.Hours >= HourFrom) || (now.Hours <= HourTo); }
场景2:特定日期的营业时间(比如某天18点到次日8点)
如果店铺的营业时间是特定日期的跨天区间(比如只在1025年4月26日18点到4月27日8点营业),那需要结合日期和小时一起判断,这时候可以把所有时间转换成总小时数(从某个起始点累计的小时数)来简化比较:
int HourFrom = 18; int HourTo = 8; bool hasOpen = false; AventurienDate now; now.set(1025, 4, 26, 1); // 当前时刻:4月26日1点 AventurienDate from; from.set(1025, 4, 26, HourFrom); // 营业时间开始:4月26日18点 AventurienDate to; to.set(1025, 4, 26, HourTo); // 营业时间结束(初始设为当天,后面调整) // 计算每个时间点的总小时数(这里假设你的AventurienDate可以计算总小时数,或者自己实现转换) long long fromTotalHours = calculateTotalHours(from); long long toTotalHours = calculateTotalHours(to); long long nowTotalHours = calculateTotalHours(now); if (HourFrom <= HourTo) { // 不跨天:当前时刻在[from, to]区间内 hasOpen = (nowTotalHours >= fromTotalHours) && (nowTotalHours <= toTotalHours); } else { // 跨天:结束时间是次日,所以把to的总小时数加24 toTotalHours += 24; // 当前时刻在[from, to+24]区间内就营业 hasOpen = (nowTotalHours >= fromTotalHours) && (nowTotalHours <= toTotalHours); } // 辅助函数:把AventurienDate转换成从某个固定点开始的总小时数 long long calculateTotalHours(AventurienDate date) { // 示例逻辑:年转小时 + 月转小时 + 日转小时 + 小时 // 假设每年12个月,每月30天,每天24小时 long long yearsInHours = (date.Year - 1) * 12 * 30 * 24; long long monthsInHours = (date.Month - 1) * 30 * 24; long long daysInHours = (date.Day - 1) * 24; return yearsInHours + monthsInHours + daysInHours + date.Hours; }
为什么你的原代码逻辑不对?
你原来的else分支里,给to加了24小时,但判断的是now.Hours >= HourFrom && now.Hours <= HourTo——这个条件永远不可能成立(比如HourFrom是18,HourTo是8,now.Hours是1的话,1 >=18不成立),所以永远会返回false,这就是问题所在。
换个思路想:跨午夜的营业时间,其实是“只要当前小时不落在两个时间的中间区间”(比如18-8的中间区间是9-17),所以反过来判断也可以:hasOpen = !(now.Hours > HourTo && now.Hours < HourFrom),效果和前面的||判断是一样的。
备注:内容来源于stack exchange,提问作者Wolfspirit
相关产品推荐
相关产品推荐

