下面这些 Rust 示例以 Unix 秒作为通用基准,只有在运行时天然提供毫秒的地方才展示毫秒。复制之前先回答一个简单的问题:下游那个 API 要的是什么单位?
获取当前 Unix 时间
use std::time::{SystemTime, UNIX_EPOCH};
let seconds = SystemTime::now()
.duration_since(UNIX_EPOCH)?
.as_secs();
把时间戳转成 UTC
use std::time::{Duration, UNIX_EPOCH};
let instant = UNIX_EPOCH + Duration::from_secs(1_700_000_000);
上生产前留意
对 Unix 纪元之前的日期,SystemTime 会返回错误。请老老实实处理这个 Result,别假设所有时间戳都是正数。
值跨越系统边界时,把单位写进字段名里:createdAtSeconds 和 createdAtMs 是比 createdAt 长了点,但出事故的时候能省下不少猜测。
Frequent questions:
- Q: SystemTime 能处理 1970 年之前的日期吗?
- A: SystemTime 本身可以表示 Unix 纪元前后的时间,但对更早的时刻,duration_since(UNIX_EPOCH) 会返回错误。如果外部时间戳可能为负,记得处理这种情况。
- Q: 每次处理时间戳都得引入 chrono 吗?
- A: 不用。只要取当前的 Unix 秒和毫秒,标准库就够了。需要解析、格式化或日历运算时,再上 chrono 或 time。
- Q: 怎么确认 Rust 里时间戳的单位?
- A: 拿一个样本值,用 chrono 或 time 转成 RFC3339,确认它符合 API 或数据库的约定,再决定这个字段到底按秒还是按毫秒来收。