代码之家  ›  专栏  ›  技术社区  ›  Wolfspirit

你如何确定一个时间点是否在一个时间段内?

  •  1
  • Wolfspirit  · 技术社区  · 10 月前

    对不起,我的英语不好。我正在编写一个有幻想约会的游戏。例如,每个月正好有30天。没关系。每一天都有24小时,就像我们的世界一样,每小时60分钟,每分钟60秒。

    所以,我想确定一家商店是否开门。数据库中的值如下:从8到18打开(例如白天),从20到2打开(例如晚上),从……打开。。。白天不是问题,但清晨的时间是因为它们是第二天。

    AventurienDate from, to;
    
    int HourFrom = 18;  // shop open from
    int HourTo = 8; // shop open to
    bool hasopen = false;
    
    AventurienDate now;
    now.set(1025, 4, 26, 1);    // Year, month, day, hour
    
    from.set(1025, 4, now.Day, HourFrom);
    to.set(1025, 4, now.Day, HourTo);
    
    if(from < to || from == to)
       hasopen = (from < now || from == now) && (to > now || to == now);
    else {
       to.addHours(24);
       if(now.Hours >= HourFrom && now.Hours <= HourTo)
          hasopen = true;
       if(hasopen == false)
          hasopen = (from < now || from == now) && (to > now || to == now);
    }
    qDebug() << "now:       " << now.toStringDateTime();
    qDebug() << "open from: " << from.toStringDateTime();
    qDebug() << "open to:   " <<to.toStringDateTime();
    qDebug() << hasopen;
    
            now:        "26. TRA 1025 BF, 01:00:00"
        open from:  "26. TRA 1025 BF, 18:00:00"
            open to:    "27. TRA 1025 BF, 08:00:00"
            false
            
    

    示例中的输出应为“true”!我想不出解决办法。有人吗?

    1 回复  |  直到 10 月前
        1
  •  0
  •   Atmo    10 月前

    白天的情况, 忽略日期,只看时间 ,微不足道( from <= now <= to ). 在C++中,这是通过AND布尔运算完成的,即。 from <= now && now <= to

    夜间的情况类似,但午夜在中间,它包括2种具有OR的情况: <= 现在 <= midnight (24:00) midnight (00:00) <= 现在 <= .
    现在 <= 午夜(24:00) 午夜(00:00) <= 现在 始终为真,可以简化,只留下一个与上述表达式相同的表达式,但用OR代替and。

    这将得到完整的布尔表达式:

    bool hasOpen = (from <= to /* daytime */ && (from <= now && now <= to)) 
                || (from >  to /*nighttime*/ && (from <= now || now <= to));