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

【Chrono库】Chrono Traits 模块解析(traits.rs)

这是 Chrono 时间库中的 traits 模块,定义了日期和时间组件的基本操作接口。

模块概述

该模块包含两个核心 trait:

  1. Datelike - 日期组件的通用方法集合
  2. Timelike - 时间组件的通用方法集合

Datelike Trait 解析

基本信息获取方法

pub trait Datelike: Sized {fn year(&self) -> i32;                    // 年份 (包含公元前)fn month(&self) -> u32;                   // 月份 (1-12)fn month0(&self) -> u32;                  // 月份 (0-11)fn day(&self) -> u32;                     // 日 (1-31)fn day0(&self) -> u32;                    // 日 (0-30)fn ordinal(&self) -> u32;                 // 年中日 (1-366)fn ordinal0(&self) -> u32;                // 年中日 (0-365)fn weekday(&self) -> Weekday;             // 星期几fn iso_week(&self) -> IsoWeek;            // ISO 周
}

便捷计算方法

年份处理

fn year_ce(&self) -> (bool, u32) {let year = self.year();if year < 1 { (false, (1 - year) as u32) } else { (true, year as u32) }
}
  • 返回 (is_ce, year_number) 元组
  • is_ce: true 表示公元后(CE/AD),false 表示公元前(BCE/BC)

季度计算

fn quarter(&self) -> u32 {(self.month() - 1).div_euclid(3) + 1
}
  • 返回 1-4 的季度数

日期修改方法

警告:这些方法需要谨慎使用,因为:

  • 中间值可能不存在(如 2月29日改为非闰年)
  • 不应连续使用多个 with_* 方法
fn with_year(&self, year: i32) -> Option<Self>;     // 修改年份
fn with_month(&self, month: u32) -> Option<Self>;   // 修改月份
fn with_month0(&self, month0: u32) -> Option<Self>; // 修改月份(0-based)
fn with_day(&self, day: u32) -> Option<Self>;       // 修改日
fn with_day0(&self, day0: u32) -> Option<Self>;     // 修改日(0-based)
fn with_ordinal(&self, ordinal: u32) -> Option<Self>;   // 修改年中日
fn with_ordinal0(&self, ordinal0: u32) -> Option<Self>; // 修改年中日(0-based)

错误情况

  • 结果日期不存在(如 2月29日改为非闰年)
  • 时区转换问题(对于 DateTime<Tz>
  • 数值超出范围

高级日期计算

儒略日计算

fn num_days_from_ce(&self) -> i32 {// 计算从公元1年1月1日开始的日数let mut year = self.year() - 1;let mut ndays = 0;// 处理公元前年份if year < 0 {let excess = 1 + (-year) / 400;year += excess * 400;ndays -= excess * 146_097;  // 400年的天数}let div_100 = year / 100;ndays += ((year * 1461) >> 2) - div_100 + (div_100 >> 2);ndays + self.ordinal() as i32
}

月份天数

fn num_days_in_month(&self) -> u8 {use num_traits::FromPrimitive;let month = Month::from_u32(self.month()).unwrap();month.num_days(self.year()).unwrap()
}

Timelike Trait 解析

基本信息获取

pub trait Timelike: Sized {fn hour(&self) -> u32;        // 小时 (0-23)fn minute(&self) -> u32;      // 分钟 (0-59)fn second(&self) -> u32;      // 秒 (0-59)fn nanosecond(&self) -> u32;  // 纳秒 (0-1,999,999,999)
}

时间格式转换

12小时制

fn hour12(&self) -> (bool, u32) {let hour = self.hour();let mut hour12 = hour % 12;if hour12 == 0 { hour12 = 12; }  // 0点转为12点(hour >= 12, hour12)  // (is_pm, hour_12)
}

时间修改方法

fn with_hour(&self, hour: u32) -> Option<Self>;      // 修改小时
fn with_minute(&self, min: u32) -> Option<Self>;     // 修改分钟
fn with_second(&self, sec: u32) -> Option<Self>;     // 修改秒
fn with_nanosecond(&self, nano: u32) -> Option<Self>; // 修改纳秒

时间计算

午夜后秒数

fn num_seconds_from_midnight(&self) -> u32 {self.hour() * 3600 + self.minute() * 60 + self.second()
}

测试模块

儒略日计算验证

测试中提供了一个替代实现来验证 num_days_from_ce 的正确性:

fn num_days_from_ce<Date: Datelike>(date: &Date) -> i32 {let year = date.year();let diff = move |div| in_between(1, year, div);date.ordinal() as i32 + 365 * diff(1) + diff(4) - diff(100) + diff(400)
}

这个实现更直观地展示了闰年规则:

  • 每年365天
  • 每4年加1天(闰年)
  • 每100年减1天(例外)
  • 每400年加1天(例外中的例外)

月份天数测试

验证不同情况下月份天数的正确性:

  • 闰年2月:29天
  • 平年2月:28天
  • 大月:31天

设计特点

  1. 零基和壹基并存:提供 month()/month0() 等对应方法
  2. 错误安全:修改方法返回 Option<Self>
  3. 性能优化:使用位运算和数学优化
  4. 完整性:支持公元前日期和闰秒
  5. 实用性:提供常用计算如季度、12小时制等

使用注意事项

  1. 避免链式修改:不要连续调用多个 with_* 方法
  2. 理解语义with_year 保持月日不变,可能改变序数日
  3. 时区考虑:对于有时区的日期时间,修改可能涉及时区转换问题

这些 trait 为 Chrono 库提供了统一的日期时间操作接口,确保了类型安全和操作的一致性。

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

相关文章:

  • Go语言使用的编译器 | 探索Go编程语言的工具链和编译过程
  • Logback,SLF4J的经典后继日志实现!
  • 搭建个人知识库
  • leetcode寻找第k大的值
  • 瑞安外贸网站制作php做网站都需要学什么软件
  • 企业级 Spring Boot + WebSocket + Redis 分布式消息推送方案
  • 线性代数 · SVD | 从线性代数到数据科学的“盛大”应用(scr:bzv)
  • 专门做推广的网站吗做当地门户网站多少钱
  • 【Java Web学习 | 第12篇】JavaScript(6)DOM
  • VVIC item_search 接口对接全攻略:从入门到精通
  • 四川住建厅官方网站的网址北京专业建设
  • 网站开发实训课程的总结手机网游
  • 《道德经》第五十八章
  • 【面试经验】梅赛德斯奔驰X-Seed AI Systems - Autonomous Driving Agent Efficiency
  • MATLAB基于CNN和DE-NSGAIII的齿盘切削参数优化
  • Node.js+Vue的学习笔记
  • 哪些网站设计的好嘉兴互联网公司
  • GM-3568JHF丨ARM+FPGA异构开发板系列教程:基础入门 1- 开发环境搭建
  • 从括号匹配到字符串解码:递归思想的巧妙应用
  • 第7章 Node框架实战篇 - Express 中间件与RESTful API 接口规范
  • 编译器用什么语言开发 | 深入探讨编译器开发的语言选择及其影响
  • 实战内网PTH上线域控
  • 基于YOLOv5-AUX的棕熊目标检测与识别系统实现
  • 东北网站建设国网典型设计最新版
  • 白酒网站设计广告设计与制作教程
  • 建设文明网站包括个人网站学生作业
  • 面对AI的思考,如何区分什么能力是人最根本的能力?
  • 当“能者”不再“多劳”:于倦怠深处,寻一方从容
  • 分布式系统测试包含子系统的系统测试,数据一致性测试,并发测试
  • less 工具 OpenHarmony PC适配实践