在Rust中如何将基于Unix时间戳的u32值转为std::time::SystemTime?
在Rust中将u32类型的Unix纪元时间转换为SystemTime
正向转换(u32 → SystemTime)
gzip头部的修改时间是基于Unix纪元的32位无符号整数(单位:秒),按照以下方式转换即可:
- 将u32值转换为
Duration类型,代表从Unix纪元到目标时间的间隔时长 - 以
SystemTime::UNIX_EPOCH为基准,加上该Duration得到目标SystemTime
示例代码:
use std::time::{SystemTime, Duration}; fn gzip_mtime_to_system_time(mtime: u32) -> SystemTime { let duration = Duration::from_secs(mtime as u64); SystemTime::UNIX_EPOCH + duration }
注意:u32的最大值对应2106年左右,这是gzip头部规范(RFC 1952)定义的范围,该转换完全符合规范要求。
反向转换(SystemTime → 整数类型)
若要将SystemTime::now()转为整数(如u32或u64),只需计算它与UNIX_EPOCH的时间差:
示例代码:
use std::time::SystemTime; fn system_time_to_unix_secs() -> Result<u64, Box<dyn std::error::Error>> { let now = SystemTime::now(); let duration_since_epoch = now.duration_since(SystemTime::UNIX_EPOCH)?; Ok(duration_since_epoch.as_secs()) }
如果需要转换为u32,建议用try_into()做安全转换,避免溢出(当时间超过2106年时,u64转u32会溢出):
// 安全转换为u32 let secs_u32: u32 = duration_since_epoch.as_secs().try_into()?;
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

