Rust 日期处理:时间与日历库
Rust 是一种现代系统编程语言,具有严格的类型系统和内存安全性。然而,Rust 的标准库仅提供最基本的日期和时间处理功能。为了全面处理日历、时区、格式化和计算,开发者需要使用第三方 crate。本文将详细介绍三个主要库:chrono、time 和 jiff,并提供实用示例。
1. chrono 库——事实上的标准
chrono 是 Rust 中最流行的日期处理库。它提供了丰富的 API,用于创建、操作和格式化日期与时间。主要类型包括:NaiveDate、NaiveDateTime、DateTime(带时区)和 Duration。
安装
# Cargo.toml[dependencies]chrono = "0.4"示例:当前日期和时间
use chrono::{Local, Utc};
fn main() { let now_utc = Utc::now(); let now_local = Local::now(); println!("UTC: {}", now_utc); println!("Local: {}", now_local);}示例:字符串解析与格式化
use chrono::NaiveDate;
fn main() { let date = NaiveDate::parse_from_str("2025-03-15", "%Y-%m-%d") .expect("日期格式无效"); println!("日期: {}", date.format("%d.%m.%Y"));}优点:庞大的社区支持,通过 chrono-tz 支持时区,可处理间隔和时长。
缺点:体积相对较大,处理非标准日历较为复杂。
2. time 库——轻量级替代方案
time 是一个更现代、更轻量的库,正在积极开发中。它使用严格的类型系统来防止错误(例如,区分 Date、Time、OffsetDateTime 和 PrimitiveDateTime)。
安装
[dependencies]time = "0.3"示例:创建日期并计算差值
use time::{Date, Month, Duration};
fn main() { let start = Date::from_calendar_date(2025, Month::March, 10).unwrap(); let end = Date::from_calendar_date(2025, Month::March, 20).unwrap(); let diff = end - start; println!("差值: {} 天", diff.whole_days());}示例:格式化
use time::OffsetDateTime;use time::format_description::well_known::Rfc3339;
fn main() { let now = OffsetDateTime::now_utc(); let formatted = now.format(&Rfc3339).unwrap(); println!("RFC 3339: {}", formatted);}优点:体积小,类型划分清晰,文档优秀。
缺点:网上的示例比 chrono 少。
3. jiff 库——用于高精度间隔
jiff 是一个专门用于处理日历间隔和重复事件的库。它对于任务调度、提醒和工作日计算非常有用。
安装
[dependencies]jiff = "0.1"示例:创建间隔并检查包含关系
use jiff::ZonedInterval;use jiff::tz::TimeZone;
fn main() { let tz = TimeZone::get("Europe/Moscow").unwrap(); let start = tz.to_zoned(2025, 3, 1, 0, 0, 0, 0).unwrap(); let end = tz.to_zoned(2025, 3, 31, 23, 59, 59, 0).unwrap(); let interval = ZonedInterval::new(start, end); let check = tz.to_zoned(2025, 3, 15, 12, 0, 0, 0).unwrap(); println!("3月15日是否在间隔内? {}", interval.contains(&check));}优点:适合日历