【ISO8601】ISO8601 Rust 库完整学习指南

一个基于 nom 解析器组合库的高性能 ISO 8601 日期时间解析库,完全使用 Rust 编写。

特性

🚀 核心功能

  • 完整的 ISO 8601 支持:解析所有标准日期、时间、日期时间和持续时间格式
  • 零拷贝解析:基于 nom 的高效解析器,最小化内存分配
  • 强类型安全:Rust 的类型系统保证解析结果的正确性
  • 丰富的错误信息:详细的错误类型帮助快速定位问题

📅 支持的格式

  • 日期YYYY-MM-DD, YYYYMMDD, YYYY-Www-D, YYYYWwwD, YYYY-DDD, YYYYDDD
  • 时间hh:mm:ss, hhmmss, hh:mm, hhmm, hh(支持小数秒和时区)
  • 日期时间YYYY-MM-DDThh:mm:ss±hh:mm 等各种组合
  • 持续时间PnYnMnDTnHnMnS, PnW 等完整持续时间格式
  • 重复间隔R[n]/start/interval 重复时间间隔

🔧 可选集成

  • Chrono 支持:与流行的 chrono 日期时间库无缝集成
  • Serde 序列化:支持所有数据结构的序列化和反序列化
  • no_std 兼容:可在嵌入式等受限环境中使用

快速开始

安装

Cargo.toml 中添加依赖:

[dependencies]
iso8601 = "0.6"

启用所有特性:

[dependencies]
iso8601 = { version = "0.6", features = ["chrono", "serde"] }

基本用法

use iso8601;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 解析日期
    let date = iso8601::date("2023-10-25")?;
    println!("解析日期: {:?}", date);

    // 解析时间
    let time = iso8601::time("14:30:45.123+08:00")?;
    println!("解析时间: {:?}", time);

    // 解析日期时间
    let datetime = iso8601::datetime("2023-10-25T14:30:45Z")?;
    println!("解析日期时间: {:?}", datetime);

    // 解析持续时间
    let duration = iso8601::duration("P1Y2M3DT4H5M6.5S")?;
    println!("解析持续时间: {:?}", duration);

    Ok(())
}

高级示例

与 Chrono 集成
use iso8601;
use chrono::{DateTime, Utc, NaiveDate};

// 启用 chrono 特性后可以直接转换
#[cfg(feature = "chrono")]
fn chrono_integration() {
    let iso_date = iso8601::date("2023-10-25").unwrap();
    let chrono_date: NaiveDate = iso_date.into();
    println!("Chrono 日期: {}", chrono_date);
    
    let iso_datetime = iso8601::datetime("2023-10-25T14:30:00Z").unwrap();
    let chrono_datetime: DateTime<Utc> = iso_datetime.into();
    println!("Chrono 日期时间: {}", chrono_datetime);
}
Serde 序列化
use iso8601;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Event {
    name: String,
    #[serde(with = "iso8601")]
    start_time: iso8601::DateTime,
    duration: iso8601::Duration,
}

fn serde_example() -> Result<(), Box<dyn std::error::Error>> {
    let event = Event {
        name: "会议".to_string(),
        start_time: iso8601::datetime("2023-10-25T14:30:00Z")?,
        duration: iso8601::duration("PT1H30M")?,
    };
    
    let json = serde_json::to_string(&event)?;
    println!("序列化事件: {}", json);
    
    let deserialized: Event = serde_json::from_str(&json)?;
    println!("反序列化事件: {:?}", deserialized.name);
    
    Ok(())
}
错误处理
use iso8601;

fn robust_parsing() {
    match iso8601::date("2023-02-30") {
        Ok(date) => println!("有效日期: {:?}", date),
        Err(iso8601::Error::OutOfRange) => {
            eprintln!("错误: 日期超出有效范围");
        }
        Err(e) => {
            eprintln!("解析错误: {}", e);
        }
    }
    
    // 处理部分解析
    match iso8601::datetime("2023-10-25T14:30") {
        Ok(datetime) => println!("解析成功: {:?}", datetime),
        Err(e) => {
            eprintln!("部分日期时间解析失败: {}", e);
            // 可以尝试只解析日期部分
            if let Ok(date) = iso8601::date("2023-10-25") {
                println!("至少日期部分有效: {:?}", date);
            }
        }
    }
}

API 参考

主要函数

函数描述示例
date()解析 ISO 8601 日期date("2023-10-25")
time()解析 ISO 8601 时间time("14:30:45Z")
datetime()解析 ISO 8601 日期时间datetime("2023-10-25T14:30:45+08:00")
duration()解析 ISO 8601 持续时间duration("P1DT2H3M4S")

数据结构

Date
let date = Date {
    year: 2023,
    month: 10,
    day: 25,
};
Time
let time = Time {
    hour: 14,
    minute: 30,
    second: 45,
    millisecond: 0,
    tz_offset_minutes: Some(480), // UTC+8
};
Duration
let duration = Duration {
    years: 1,
    months: 2,
    days: 3,
    hours: 4,
    minutes: 5,
    seconds: 6,
    nanoseconds: 500_000_000, // 0.5 秒
};

性能特点

  • 零分配解析:大部分解析操作不需要堆分配
  • 快速失败:无效输入能够快速识别并返回错误
  • 流式处理:支持处理大型数据流中的日期时间字符串
  • 内存安全:Rust 的所有权系统保证内存安全

与其他库比较

特性iso8601chronotime
ISO 8601 专门化✅ 专注❌ 通用❌ 通用
零依赖核心
nom 解析器
Chrono 集成✅ 可选✅ 原生
序列化支持✅ 可选

开发状态

当前版本:0.6.3 - 生产就绪

稳定性

  • ✅ 核心解析功能稳定
  • ✅ 错误处理完善
  • ✅ 文档完整
  • ✅ 测试覆盖全面

兼容性

  • Rust 版本:2018 及更高版本
  • nom 版本:8.x
  • 可选:chrono 0.4, serde 1.0

开发设置

# 克隆仓库
git clone https://github.com/badboy/iso8601.git
cd iso8601

# 运行测试
cargo test

# 运行所有特性的测试
cargo test --all-features

# 生成文档
cargo doc --open

# 运行基准测试
cargo bench

许可证

MIT 许可证 - 详见 LICENSE 文件。

致谢

  • 感谢 nom 解析器组合库
  • 感谢 chrono 日期时间库的灵感
  • 感谢所有贡献者和用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuyuan77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值