You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需自行计算,如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:36:11