Rust 日期处理:关键库概览
Rust 是一种注重安全性和性能的系统编程语言。然而,由于时区、闰秒和格式问题,日期和时间处理始终是一项复杂的任务。在 Rust 生态系统中,有几个成熟的库可以解决这些问题。本文将介绍三个主要库:chrono、time 和 jiff,并展示如何在实际中使用它们。
1. Chrono — 主流标准
chrono 是 Rust 中最流行的日期处理库。它提供了一套完整的工具:解析、格式化、日期运算、时区处理以及通过 serde 进行序列化。
通过 Cargo.toml 安装:
[dependencies]chrono = { version = "0.4", features = ["serde"] }基本使用示例:
use chrono::{NaiveDate, NaiveDateTime, Duration, Utc, Local};
fn main() { // 当前 UTC 日期和时间 let utc_now = Utc::now(); println!("当前 UTC 时间: {}", utc_now.format("%Y-%m-%d %H:%M:%S"));
// 本地时间 let local_now = Local::now(); println!("本地时间: {}", local_now.format("%d.%m.%Y %H:%M"));
// 创建特定日期 let date = NaiveDate::from_ymd_opt(2025, 3, 14).unwrap(); println!("日期: {}", date);
// 日期运算 let next_week = date + Duration::days(7); println!("一周后: {}", next_week);
// 解析字符串 let parsed = NaiveDateTime::parse_from_str( "2025-12-31 23:59:59", "%Y-%m-%d %H:%M:%S" ).unwrap(); println!("解析结果: {}", parsed);}2. Time 库 — 现代替代方案
time 是一个更新、更严格的库,吸取了 chrono 的经验教训。它提供了清晰的类型划分:Date、Time、OffsetDateTime 和 PrimitiveDateTime。支持宏,方便创建日期。
安装:
[dependencies]time = { version = "0.3", features = ["macros", "serde"] }示例:
use time::{Date, Time, OffsetDateTime, macros::datetime, Duration};
fn main() { // 当前时间 let now = OffsetDateTime::now_utc(); println!("当前时间: {}", now);
// 通过宏创建日期 let meeting = datetime!(2025-06-15 14:30:00 +03:00); println!("会议时间: {}", meeting);
// 提取组件 let date = meeting.date(); let time = meeting.time(); println!("日期: {}, 时间: {}", date, time);
// 计算差值 let deadline = datetime!(2025-12-31 00:00:00 UTC); let diff = deadline - now; println!("距离截止日期: {} 天", diff.whole_days());
// 格式化 let formatted = now.format( &time::format_description::well_known::Rfc3339 ).unwrap(); println!("RFC 3339: {}", formatted);}重要提示: time 库是官方 Rust 组织的一部分,被认为更安全,因为它在大多数方法中避免了 panic(使用 Result)。
3. Jiff — 新星
jiff 是一个相对较新的库,专注于人体工程学和性能。其主要特点是自动时区检测和内置日历支持(公历、伊斯兰历、犹太历)。
安装:
[dependencies]jiff = "0.1"使用示例:
use jiff::{Zoned, Timestamp, Unit};
fn main() { // 带时区的当前时间 let now = Zoned::now(); println!("当前时间: {}", now);
// 从时间戳创建 let ts = Timestamp::new(1_700_000_000, 0