【问题标题】:Best way to compare times (hours and seconds) without a date in C?在C中比较没有日期的时间(小时和秒)的最佳方法?
【发布时间】:2019-12-06 19:59:03
【问题描述】:

基本上我需要一个 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,这是否意味着您有时间在一个结构中?你不能只使用这些值吗?
  • 如果我必须将当前时间与例如时间进行比较,我该如何使用 time()时间“20:33”?
  • time() 取模 (24 * 60 * 60)(又名 86400)的值给出了 POSIX 机器上从一天开始(UTC 午夜)开始的秒数。 POSIX 时间系统不跟踪闰秒。如果您不住在 UTC 时区,则需要补偿您的时区与 UTC 的偏移——这就是生活开始变得棘手的地方。

标签: c strftime


【解决方案1】:

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;
}

【讨论】:

  • @chqrlie:OP 说:“对于时间开关,我只需要比较小时和分钟”
  • 好的。但是我会使用防御性编程并与timeToSwitchOntimeToSwitchOff 进行比较,以防万一测试在随机时间被调用,例如在开机序列期间。
【解决方案2】:

很容易从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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多