如何测试chrono::DateTime<Local>是否在某些特定时间范围内?

8
我希望比较当前本地时间和一个固定的时间范围,但我的当前解决方案似乎比我预期的更加困难。
我可以使用Local::now()构建一个chrono::DateTime<Local>。然后我可以费力地找出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,然后再检查——嗯嗯嗯... 这很无聊。我可以尝试使用parse_from_rfc2822进行字符串表示,但是我必须首先发出当前日期,然后编辑当天的时间,然后检查解析错误,现在我又要睡觉了。 我想我可能只是没有正确阅读chrono文档。如果我要实现该库,我将尝试构建一个实现OrdTimeOfDay<Local>数据类型,从而允许惯用范围检查。我认为它已经存在于某个地方,我只是漏掉了它。

相关:https://dev59.com/isTra4cB1Zd3GeqPzSw_ - Code4R7
1个回答

7

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

点此前往播放区以便查看完整内容。


问题32311得到解决后,它将变得更加漂亮。 - Shepmaster
@Shepmaster - 我想你是指会有一个 TimeRange 结构体,用于解决这种问题的 .contains 方法? - MutantOctopus
2
我的意思是,你可以用现有的Range结构体替换你的方法。这就是泛型和组合的美妙之处;-)。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接