Rust 日期处理:时间与日期库概览

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

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

开始课程

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

推荐