在 C 中比较没有日期的时间(小时和秒)的最佳方法?

Best way to compare times (hours and seconds) without a date in C?

基本上我需要一个 C 语言的时间开关。 我使用 strftime 获取当前日期和时间。 所以最后我得到了字符串形式的信息。

对于时间开关我只需要比较小时和分钟。 所以在伪代码中,例如:

static bool isSwitchedOn = false;
if(timeOfDay>timeToSwitchOn && !isSwitchedOn) {
   switchOn(); 
   isSwitchedOn = true;
} 
else if(timeOfDay>=timeToSwitchOf && isSwitchedOn) {
   switchOff(); 
   isSwitchedOn = false;
} 

一种解决方案是使用 atoi 将所有时间转换为 int,然后分别比较小时和分钟。

我看到我也许可以使用 difftime,但这也需要一个日期,我根本不想使用日期。所以,因为我已经有时间了,这个问题不是 How do I measure time in C?

的重复

编辑:抱歉,我不够清楚。 我没有可用的日期信息来比较当前时间。 它更像是每天在时间 20:33 打开和 20:55 关闭。

有没有更好的解决方案?

谢谢

strftime() 基于 struct tm.
的值 直接使用该值进行比较,而不是字符串。

int timeToSwitchOn = 2033; // switch on a little after 8pm
int timeToSwitchOff = 2055; // switch off just before 9pm
// strftime(..., &tm);
if (tm.tm_hour*100 + tm.tm_min > timeToSwitchOn && !isSwitchedOn) {
    switchOn(); 
    isSwitchedOn = true;
}

tm 结构计算基于 24 小时的分钟数很容易,而不是使用 strftime():

将其转换为字符串
timeOfDay = t.tm_hour * 60 + t.tm_min;

但是你的方法有一个缺陷:如果系统在timeToSwitchOftimeToSwitchOn < timeToSwitchOf之后启动,开关将被错误地打开。像这样的错误或许可以解释为什么路灯有时会在光天化日之下点亮。

这是修改后的测试:

struct tm t;   // this is populated for the current time
...
static bool isSwitchedOn = false;
int timeOfDay = t.tm_hour * 60 * t.tm_min;

if ((timeToSwitchOn < timeToSwitchOff && (timeOfDay >= timeToSwitchOn && timeOfDay < timeToSwitchOff))
||  (timeToSwitchOn > timeToSwitchOff && (timeOfDay >= timeToSwitchOn || timeOfDay < timeToSwitchOff)) {
        if (!isSwitchedOn) {
            switchOn(); 
            isSwitchedOn = true;
        }
    } else {
        if (isSwitchedOn) {
            switchOff(); 
            isSwitchedOn = false;
        }
    }
}

请注意,这里的特殊情况 timeToSwitchOn == timeToSwitchOff 表示始终关闭。如果你想让系统一直开机,设置timeToSwitchOn = 0timeToSwitchOff = 24 * 60