如何测试 chrono::DateTime<Local> 是否落在一天中的特定时间?
How can I test if a chrono::DateTime<Local> falls within certain times of day?
我想将当前当地时间与固定时间范围进行比较,但我目前的解决方案似乎比我预期的要难。
我可以用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,并且然后检查 — zzzzz...
真无聊。我可以尝试用 parse_from_rfc2822
表示字符串,但我必须先发出当前日期,然后在一天中的时间进行编辑,然后检查解析错误,现在我又要睡觉了。
我想我只是读错了 chrono documentation。如果我要实现这个库,我会尝试构建一个实现 Ord
的 TimeOfDay<Local>
数据类型,从而允许惯用的范围检查。我想它已经在某个地方了,我只是想念它。
DateTime
个对象有一个名为 time()
, which returns a NaiveTime
object representing the time of day. NaiveTime
implements PartialOrd
, and has a factory function 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...
};
我想将当前当地时间与固定时间范围进行比较,但我目前的解决方案似乎比我预期的要难。
我可以用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,并且然后检查 — zzzzz...
真无聊。我可以尝试用 parse_from_rfc2822
表示字符串,但我必须先发出当前日期,然后在一天中的时间进行编辑,然后检查解析错误,现在我又要睡觉了。
我想我只是读错了 chrono documentation。如果我要实现这个库,我会尝试构建一个实现 Ord
的 TimeOfDay<Local>
数据类型,从而允许惯用的范围检查。我想它已经在某个地方了,我只是想念它。
DateTime
个对象有一个名为 time()
, which returns a NaiveTime
object representing the time of day. NaiveTime
implements PartialOrd
, and has a factory function 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...
};