最好的方式来比较时间(小时和秒)而不用C表示日期?

时间:2019-07-29 13:04:28

标签: c strftime

基本上,我需要在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关闭一样。

有更好的解决方案吗?

谢谢

2 个答案:

答案 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;

但是您的方法有一个缺陷:如果在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