下面这些 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 或数据库的约定,再决定这个字段到底按秒还是按毫秒来收。