You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义奇幻日期系统中判断当前时刻是否处于店铺营业时间(含跨午夜场景)

如何在自定义奇幻日期系统中判断当前时刻是否处于店铺营业时间(含跨午夜场景)

嘿,我完全懂你碰到的这个麻烦——跨午夜的营业时间判断确实容易绕晕,尤其是在自己写的奇幻日期系统里。咱们先把问题拆解开,再一步步修正你的代码逻辑。

首先,核心问题很明确:

  • 当营业时间是同一天内(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 06:58:05