【Chrono库】Chrono 时间舍入模块解析(round.rs)
这是一个 Rust 时间库 Chrono 中的舍入功能模块,提供了对日期时间进行舍入和截断操作的功能。
模块概述
该模块主要提供两种舍入功能:
- 亚秒级舍入 - 处理纳秒精度的舍入
- 时间增量舍入 - 按任意时间间隔舍入
核心特性解析
1. 亚秒级舍入 (SubsecRound)
pub trait SubsecRound {fn round_subsecs(self, digits: u16) -> Self;fn trunc_subsecs(self, digits: u16) -> Self;
}
功能:
round_subsecs: 四舍五入到指定的小数位数trunc_subsecs: 截断到指定的小数位数
实现原理:
- 使用
span_for_digits函数计算对应精度的纳秒跨度 - 通过模运算找到需要调整的纳秒数
- 根据舍入规则调整时间
示例:
- 154毫秒舍入到2位小数 → 150毫秒
- 154毫秒舍入到1位小数 → 200毫秒
2. 时间增量舍入 (DurationRound)
pub trait DurationRound: Sized {fn duration_round(self, duration: TimeDelta) -> Result<Self, Self::Err>;fn duration_trunc(self, duration: TimeDelta) -> Result<Self, Self::Err>;fn duration_round_up(self, duration: TimeDelta) -> Result<Self, Self::Err>;
}
三种舍入模式:
duration_round: 标准四舍五入duration_trunc: 向下截断duration_round_up: 向上取整
核心算法实现
亚秒级舍入算法
fn round_subsecs(self, digits: u16) -> T {let span = span_for_digits(digits);let delta_down = self.nanosecond() % span;if delta_down > 0 {let delta_up = span - delta_down;if delta_up <= delta_down {self + TimeDelta::nanoseconds(delta_up.into())} else {self - TimeDelta::nanoseconds(delta_down.into())}} else {self // unchanged}
}
时间增量舍入算法
fn duration_round<T>(naive: NaiveDateTime, original: T, duration: TimeDelta) -> Result<T, RoundingError>
{if let Some(span) = duration.num_nanoseconds() {if span <= 0 {return Err(RoundingError::DurationExceedsLimit);}let stamp = naive.and_utc().timestamp_nanos_opt().ok_or(RoundingError::TimestampExceedsLimit)?;let delta_down = stamp % span;// ... 舍入逻辑}
}
错误处理
定义了 RoundingError 枚举处理各种错误情况:
pub enum RoundingError {DurationExceedsTimestamp, // 已弃用DurationExceedsLimit, // 时间增量超出纳秒表示范围TimestampExceedsLimit, // 时间戳超出纳秒表示范围
}
关键技术点
1. 精度跨度计算
const fn span_for_digits(digits: u16) -> u32 {match digits {0 => 1_000_000_000, // 1秒1 => 100_000_000, // 0.1秒2 => 10_000_000, // 0.01秒// ... 其他精度_ => 1, // 1纳秒}
}
2. 负值处理
代码特别注意处理负时间戳的情况,确保在 Unix 纪元之前的时间也能正确舍入。
3. 边界条件处理
- 检查时间增量是否为正数
- 处理纳秒溢出的情况
- 支持大时间跨度的舍入
应用场景
- 数据序列化 - 降低精度以减少存储空间
- 时间对齐 - 将时间对齐到固定间隔(如5分钟、1小时)
- 测试验证 - 确保时间比较的一致性
- 显示格式化 - 控制时间显示的精度
设计亮点
- 泛型实现 - 支持
DateTime<Tz>和NaiveDateTime - 错误安全 - 明确的错误类型和边界检查
- 性能优化 - 使用模式匹配和常量函数
- 完整性 - 提供舍入、截断、向上取整三种模式
这个模块是 Chrono 库中处理时间精度的重要组件,为时间数据的后处理提供了强大而灵活的工具。
