在 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)
- 支持非标准日历(伊斯兰历、希伯来历等)
- 高级的区间和周期处理
- 通过惰性计算实现高性能