当前位置: 首页 > news >正文

【Chrono库】Chrono 时间舍入模块解析(round.rs)

这是一个 Rust 时间库 Chrono 中的舍入功能模块,提供了对日期时间进行舍入和截断操作的功能。

模块概述

该模块主要提供两种舍入功能:

  1. 亚秒级舍入 - 处理纳秒精度的舍入
  2. 时间增量舍入 - 按任意时间间隔舍入

核心特性解析

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. 边界条件处理

  • 检查时间增量是否为正数
  • 处理纳秒溢出的情况
  • 支持大时间跨度的舍入

应用场景

  1. 数据序列化 - 降低精度以减少存储空间
  2. 时间对齐 - 将时间对齐到固定间隔(如5分钟、1小时)
  3. 测试验证 - 确保时间比较的一致性
  4. 显示格式化 - 控制时间显示的精度

设计亮点

  1. 泛型实现 - 支持 DateTime<Tz>NaiveDateTime
  2. 错误安全 - 明确的错误类型和边界检查
  3. 性能优化 - 使用模式匹配和常量函数
  4. 完整性 - 提供舍入、截断、向上取整三种模式

这个模块是 Chrono 库中处理时间精度的重要组件,为时间数据的后处理提供了强大而灵活的工具。

http://www.dtcms.com/a/614646.html

相关文章:

  • 网站建设微信文章企业建网站费用
  • 二十二、注意力机制与序列模型
  • 花垣做网站怎么上传软件到网站
  • Spring Boot+Vue项目从零入手
  • 【BuildFlow 筑流】MonthDuration 类型深度解析及源码
  • 中铁中基建设集团网站同一服务器建两个wordpress
  • C语言编译软件的获取与选择方法 | 如何挑选适合的C语言编译工具
  • 电子商务网站建设设计报告网推app下载
  • 华为云建网站网站建设情况 报告
  • 做地方分类信息网站需要什么资质吗大沥南庄网站建设
  • 企业网站备案信息查询备案时注意网站名称规范
  • 如何做vip微信电影网站抖音珠宝代运营
  • 2025年--Lc267-7. 整数反转-Java版
  • 从零开始学二叉树(中):堆与完全二叉树的奥秘
  • 嘉兴网站建设嘉兴成都p2p网站建设
  • 旅游网站策划书设计颜色搭配网站
  • 选择AI决策解决方案需要注意哪些安全和数据隐私问题?
  • asp建设的网站制作外贸网站空间哪个好
  • 算法笔记 12 哈希表 | 图
  • Ubuntu中如何进入root用户
  • 宝安印刷网站建设wordpress导航代码
  • 世界上有几个空间站福州百度seo排名软件
  • OpenGL:Uniform Block
  • 网站建设方案怎么做WordPress防红
  • 数据分析笔记07:Python编程语言介绍
  • 网站建设 佛山市wordpress 文字背景颜色
  • 一文讲清 this 所有知识点
  • 【以太网交换机】交换机通关指南!自学习算法 + 交换模式 + 核心对比
  • 电子商务网站搭建方案房屋在线设计网站
  • 双目相机标定时左右目图片角点识别顺序错误问题的解决办法(c++)