无需自行计算,如何在Rust中创建小时级Duration适配Tokio?
几种简便设置Tokio定时任务间隔的方法
1. 用 humantime 库解析可读时间字符串
这是最省心的方式,支持直接写"1h"、"30m"、"2d"这类人类友好的时间格式,和Tokio完全兼容。
首先在Cargo.toml添加依赖:
[dependencies] tokio = { version = "1.0", features = ["full"] } humantime = "2.1"
然后修改代码:
use std::time::Duration; use tokio::time; use humantime::parse_duration; #[tokio::main] async fn main() { // 直接解析"1小时"对应的字符串,还支持"30m"、"2h30m"等格式 let interval_duration = parse_duration("1h").unwrap(); let mut interval = time::interval(interval_duration); loop { interval.tick().await; println!("trigger"); } }
2. 自己封装Duration扩展方法
如果不想引入额外依赖,可以给标准库的Duration写个简单的扩展 trait,实现hours、minutes这类快捷方法:
use std::time::Duration; use tokio::time; // 定义扩展 trait trait DurationShortcuts { fn hours(hours: u64) -> Self; fn minutes(mins: u64) -> Self; fn seconds(secs: u64) -> Self; } // 给Duration实现这个trait impl DurationShortcuts for Duration { fn hours(hours: u64) -> Self { Duration::from_secs(hours * 3600) } fn minutes(mins: u64) -> Self { Duration::from_secs(mins * 60) } fn seconds(secs: u64) -> Self { Duration::from_secs(secs) } } #[tokio::main] async fn main() { // 直接调用自定义的hours方法 let mut interval = time::interval(Duration::hours(1)); loop { interval.tick().await; println!("trigger"); } }
3. 标准库原生简化写法(无需额外依赖)
Rust 1.55+ 后,Duration的构造方法支持const fn,可以直接用乘法组合让写法更直观:
use std::time::Duration; use tokio::time; #[tokio::main] async fn main() { let one_hour = Duration::from_secs(1 * 60 * 60); let mut interval = time::interval(one_hour); loop { interval.tick().await; println!("trigger"); } }
补充:chrono的兼容用法
你之前尝试的chrono其实可以和Tokio配合,只需要把chrono的Duration转换成标准库的Duration即可:
use chrono::Duration as ChronoDuration; use std::time::Duration; use tokio::time; #[tokio::main] async fn main() { let chrono_hour = ChronoDuration::hours(1); // 转换为标准库Duration let std_duration = Duration::from_secs(chrono_hour.num_seconds() as u64); let mut interval = time::interval(std_duration); loop { interval.tick().await; println!("trigger"); } }
不过这种方式相比前几种步骤稍繁琐,适合已经在项目中使用chrono的场景。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

