【问题标题】:How can I test if a chrono::DateTime<Local> falls within certain times of day?如何测试 chrono::DateTime<Local> 是否在一天中的特定时间范围内?
【发布时间】:2018-07-28 12:53:45
【问题描述】:

我想将当前本地时间与恒定时间范围进行比较,但我当前的解决方案似乎比我预期的要困难。

我可以用Local::now() 构造一个chrono::DateTime&lt;Local&gt;。然后我可以费力地找出now 是否位于特定的时间范围内,如下所示:

let current_hour = now.hour();
let current_minute = now.minute();

// see if `now` lies between 06:00 and 23:00
current_hour >= 6 && current_hour < 23

// note the inelegance of the syntax and the potential for fencepost errors

如果我想检查 06:12–23:15 的范围,问题会变得更糟,因为我必须检查小时是否等于 6,然后检查分钟是否大于 12,然后检查 — zzzzz ...

这很无聊。我可以尝试使用parse_from_rfc2822 进行字符串表示,但是我必须首先发出当前日期,然后在一天中的时间进行编辑,然后检查解析错误,现在我又在睡觉了。

我想我只是读错了chrono documentation。如果我要实现这个库,我会尝试构建一个实现OrdTimeOfDay&lt;Local&gt; 数据类型,从而允许进行惯用的范围检查。我想它已经在某个地方了,我只是想念它。

【问题讨论】:

    标签: rust rust-chrono


    【解决方案1】:

    DateTime 对象有一个名为time() 的函数,它返回一个代表一天中时间的NaiveTime 对象。 NaiveTime 实现了PartialOrd,并具有工厂函数from_hms(hour, min, sec)。使用from_hms,您可以创建一个上限和下限NaiveTime,然后使用标准运算符进行比较。

    let low = NaiveTime::from_hms(6, 12, 0);
    let high = NaiveTime::from_hms(23, 15, 0);
    let time_of_day = Local::now().time();
    
    if (time_of_day > low) && (time_of_day < high) {
        // do stuff...
    } else {
        // do something else...
    };
    

    Playground link for completeness.

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多