在 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;
但是你的方法有一个缺陷:如果系统在timeToSwitchOf
和timeToSwitchOn < 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 = 0
和timeToSwitchOff = 24 * 60
。
基本上我需要一个 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;
但是你的方法有一个缺陷:如果系统在timeToSwitchOf
和timeToSwitchOn < 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 = 0
和timeToSwitchOff = 24 * 60
。