如何测试 chrono::DateTime<Local> 是否在一天中的特定时间范围内?

Mat*_*iak 8 rust rust-chrono

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

\n\n

我可以构造一个chrono::DateTime<Local>with Local::now(). 然后我可以费力地找出是否now位于特定时间范围内,如下所示:

\n\n
let current_hour = now.hour();\nlet current_minute = now.minute();\n\n// see if `now` lies between 06:00 and 23:00\ncurrent_hour >= 6 && current_hour < 23\n\n// note the inelegance of the syntax and the potential for fencepost errors\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

我想我只是错误地阅读了计时文档。如果我要实现该库,我会尝试构建一个TimeOfDay<Local>实现 的数据类型Ord,从而允许惯用的范围检查。我想它已经在某个地方了,但我只是想念它。

\n

Mut*_*pus 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...
};
Run Code Online (Sandbox Code Playgroud)

为了完整性,游乐场链接。

  • 我的意思是[您将能够用现有的 `Range` 结构替换您的方法](https://play.rust-lang.org/?gist=cc7c00d1bbba2d82fd9c3159bdee632f&amp;version=nightly)。这就是泛型和可组合性的美妙之处;-)。 (2认同)