基本上,我需要在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关闭一样。
有更好的解决方案吗?
谢谢
答案 0 :(得分:1)
# Check if file (works with files with and without extension)
Test-Path -Path 'C:\Demo\FileWithExtension.txt' -PathType Leaf
Test-Path -Path 'C:\Demo\FileWithoutExtension' -PathType Leaf
# Check if folder
Test-Path -Path 'C:\Demo' -PathType Container
基于strftime()
的值。
直接将该值而不是字符串用于比较。
struct tm
答案 1 :(得分:0)
很容易从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
。