外观
第 7 节:时间与计时
标准库的时间三件套:Instant(计时器)、Duration(时间段)、SystemTime(真实时刻)。分工明确,别用混。
Instant:给代码计时 ⭐
rust
use std::time::Instant;
let start = Instant::now();
// ……要计时的代码……
let elapsed = start.elapsed();
println!("耗时:{:?}", elapsed);
println!("约 {} 毫秒", elapsed.as_millis());Instant 是"秒表":now() 按下,elapsed() 读表。性能测试、限时任务、超时判断,都是它。它和"墙上时间"无关(不受调系统时间影响)——只用来量"过了多久"。
Duration:时间段 ⭐
Duration 是"一段时间",各种单位互相换算:
rust
use std::time::Duration;
let two_seconds = Duration::from_secs(2);
let half = Duration::from_millis(500);
let total = two_seconds + half; // 时间段可以加减
println!("{} 毫秒", total.as_millis()); // 2500
println!("2 秒 > 500 毫秒:{}", two_seconds > half); // true,可以比较
let speed = Duration::from_secs_f64(1.5); // 带小数秒常用构造:from_secs/from_millis/from_micros/from_nanos/from_secs_f64; 常用读取:as_secs/as_millis/as_micros(注意:as_ 系列会截断小数,1.5 秒的 as_secs() 是 1)。
经典场景:超时截止时间
rust
let deadline = Instant::now() + Duration::from_secs(30);
// ……干活……
if Instant::now() >= deadline {
println!("超时了!");
}SystemTime:真实世界的时刻 ✨
rust
use std::time::{Duration, SystemTime};
let now = SystemTime::now();
let deadline = now + Duration::from_secs(30); // 30 秒后的时刻
match deadline.duration_since(now) {
Ok(remaining) => println!("还剩 {} 秒", remaining.as_secs()),
Err(_) => println!("时间倒流了?"), // 目标时刻在 now 之前
}UNIX 时间戳(1970 年 1 月 1 日以来的秒数,数据库/日志/API 通用):
rust
match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
Ok(elapsed) => println!("UNIX 时间戳:{} 秒", elapsed.as_secs()),
Err(_) => println!("系统时间早于 1970?"),
}"某个具体日期(2026 年 8 月 1 日)"的格式化、日历运算,标准库没有——那是 chrono 库的地盘(常见库篇会讲)。标准库只管"时刻"和"时长",不管"日历"。
三件套怎么选
量"过了多久" → Instant;表示"一段时间" → Duration;要"当前时刻/时间戳" → SystemTime。 想"几月几号星期几" → 去常见库篇找 chrono。
常见误用
- 用
SystemTime计时:系统时间会被用户/时钟同步改动,计时会飘——计时用Instant as_secs当"秒数"直接算:as_系列截断小数,要精确用as_millis/as_micros或先转f64duration_since返回Result:目标时刻可能在"现在"之前(时间倒流),别unwrap——saturating_duration_since或duration_since(...).unwrap_or_default()更稳