Rust 日期处理:时间库概览

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Rust 中处理日期:核心库概览



Rust 生态系统提供了几个强大的库来处理日期和时间。与 Python 内置的 datetime 模块不同,Rust 的标准库只提供最基本的功能(std::time::Instant 和 Duration),因此对于复杂任务,我们需要借助外部 crate。本文将介绍三个主要库:Chrono、Time 和 Jiff。



1. Chrono — 事实上的标准



Chrono 是最流行的库(下载量超过 1 亿次)。它提供了一套完整的工具来处理日期、时间、时区和格式化。



主要功能:

  • NaiveDate、NaiveDateTime — 不带时区的日期和时间
  • DateTime<Tz> — 带时区的日期时间
  • 支持 Duration 和算术运算
  • 通过 format! 进行格式化以及字符串解析
  • 日历支持(公历、ISO)


代码示例:

use chrono::{DateTime, Utc, NaiveDate, Duration};

fn main() { // UTC 当前时间 let now: DateTime<Utc> = Utc::now(); println!("当前时间: {}", now.format("%Y-%m-%d %H:%M:%S"));

// 创建特定日期 let date = NaiveDate::from_ymd_opt(2025, 3, 15).unwrap(); println!("日期: {}", date);

// 日期算术 let future = now + Duration::days(30); println!("30天后: {}", future.format("%d.%m.%Y"));

// 字符串解析 let parsed = "2025-01-01 12:00:00" .parse::<DateTime<Utc>>() .expect("日期格式无效"); println!("解析结果: {}", parsed);}


Chrono 非常适合大多数项目,但如果只需要基本功能,它可能显得有些臃肿。



2. Time — 现代替代方案



Time crate(由 Jacob Pratt 开发)定位为 Chrono 的更安全、更符合人体工程学的替代品。它采用严格的类型系统,并避免运行时 panic。



主要区别:

  • 所有操作都返回 Result — 没有隐藏的 panic
  • 更严格的类型系统:日期、时间、偏移量都有独立的类型
  • 内置支持 ISO 8601 和 RFC 3339
  • 体积更小,编译速度更快


代码示例:

use time::{Date, Month, OffsetDateTime, Duration, format_description};

fn main() -> Result<(), time::Error> { // 当前时间 let now = OffsetDateTime::now_utc(); println!("现在: {}", now);

// 创建日期(无 panic) let date = Date::from_calendar_date(2025, Month::March, 15)?; println!("日期: {}", date);

// 算术运算 let week_later = now + Duration::weeks(1); println!("一周后: {}", week_later);

// 使用显式格式进行解析 let format = format_description::parse("[year]-[month]-[day]")?; let parsed = Date::parse("2025-12-31", &format)?; println!("解析结果: {}", parsed); Ok(())}


对于注重安全性和可预测性的新项目来说,Time 是一个绝佳的选择。



3. Jiff — 最新成员



Jiff(由 BurntSushi 开发,他也是 regex 和 ripgrep 的创建者)是最新的库(2024 年发布)。它专注于时区处理和国际化。



特点:

  • 内置时区数据库(IANA)
  • 支持非标准日历(伊斯兰历、希伯来历等)
  • 高级的区间和周期处理
  • 通过惰性计算实现高性能


代码示例:

推荐