Rust时间解析库fundu-core的使用,高效处理日期时间格式化和解析的强大工具

Rust时间解析库fundu-core的使用,高效处理日期时间格式化和解析的强大工具

fundu-core是一个可配置、精确且快速的Rust字符串到Duration的解析器库。

概述

fundu-core是驱动fundu实现的核心库,提供了字符串到Duration的转换功能。

许可证

MIT许可证

示例代码

use fundu_core::{DurationParser, ParseError};
use std::time::Duration;

fn main() -> Result<(), ParseError> {
    // 创建一个默认的持续时间解析器
    let parser = DurationParser::new();
    
    // 解析字符串为Duration
    let duration = parser.parse("1h 30m 15s")?;
    
    // 打印解析结果
    println!("解析结果: {:?}", duration);
    assert_eq!(duration, Duration::new(3600 + 1800 + 15, 0));
    
    Ok(())
}

完整示例

use fundu_core::{Config, DurationParser, ParseError};
use std::time::Duration;

fn main() -> Result<(), ParseError> {
    // 自定义配置
    let config = Config {
        allow_time_designators: true,  // 允许时间指示符
        allow_ago: true,               // 允许"ago"后缀
        ..Default::default()
    };
    
    // 使用自定义配置创建解析器
    let parser = DurationParser::with_config(&config);
    
    // 解析各种时间格式
    let durations = vec![
        parser.parse("1h 30m")?,       // 1小时30分钟
        parser.parse("2 days ago")?,   // 2天前
        parser.parse("P1DT1H1M1S")?,   // ISO 8601格式
        parser.parse("1:30:15")?,      // 时分秒格式
    ];
    
    // 打印所有解析结果
    for (i, duration) in durations.iter().enumerate() {
        println!("示例 {}: {:?}", i + 1, duration);
    }
    
    Ok(())
}

进阶示例

use fundu_core::{Config, DurationParserBuilder, ParseError, TimeUnit::*};
use std::time::Duration;

fn main() -> Result<(), ParseError> {
    // 使用构建器模式创建更复杂的配置
    let parser = DurationParserBuilder::new()
        .default_unit(Second)  // 设置默认单位为秒
        .allowed_units(&[Second, Minute, Hour, Day])  // 允许的单位
        .number_is_optional(false)  // 数字是否为可选
        .disable_exponent()  // 禁用指数表示
        .build();
    
    // 解析自定义格式的时间
    let durations = vec![
        parser.parse("1.5h")?,  // 1.5小时
        parser.parse("30m")?,   // 30分钟
        parser.parse("86400")?, // 86400秒(1天)
    ];
    
    // 验证解析结果
    assert_eq!(durations[0], Duration::new(5400, 0));  // 1.5h = 5400秒
    assert_eq!(durations[1], Duration::new(1800, 0));  // 30m = 1800秒
    assert_eq!(durations[2], Duration::new(86400, 0)); // 86400秒
    
    Ok(())
}

安装

在项目目录中运行以下Cargo命令:

cargo add fundu-core

或在Cargo.toml中添加以下行:

fundu-core = "0.3.1"

特性

  1. 可配置的解析选项
  2. 支持多种时间格式
  3. 精确的持续时间计算
  4. 高性能解析

文档

更多详细用法请参考官方文档。


1 回复

Rust时间解析库fundu-core的使用指南

介绍

fundu-core是Rust中一个高效的时间解析库,专注于日期时间格式化和解析功能。它提供了强大的时间字符串解析能力,支持多种时间格式,并且性能优异。

主要特性

  • 高性能的时间解析和格式化
  • 支持多种时间格式
  • 灵活的配置选项
  • 轻量级核心功能
  • 良好的错误处理

安装

在Cargo.toml中添加依赖:

[dependencies]
fundu-core = "0.3"

基本使用方法

解析时间字符串

use fundu_core::time::TimeSpan;
use fundu_core::parse;

fn main() {
    let result = parse("1h 30m");
    match result {
        Ok(time_span) => {
            println!("解析结果: {}秒", time_span.to_seconds());
        }
        Err(e) => {
            println!("解析错误: {}", e);
        }
    }
}

格式化时间

use fundu_core::time::TimeSpan;
use fundu_core::format::format_time;

fn main() {
    let time_span = TimeSpan::from_seconds(5430); // 1小时30分钟30秒
    let formatted = format_time(&time_span);
    println!("格式化结果: {}", formatted); // 输出: 1h 30m 30s
}

高级用法

自定义解析格式

use fundu_core::parse;
use fundu_core::time::TimeSpan;

fn main() {
    let result = parse("1.5d 2:30:00");
    match result {
        Ok(time_span) => {
            println!("总秒数: {}", time_span.to_seconds()); // 输出: 140400 (1.5天 + 2.5小时)
        }
        Err(e) => println!("错误: {}", e),
    }
}

处理复杂时间表达式

use fundu_core::parse;

fn main() {
    let expressions = vec![
        "1y 6mo",          // 1年6个月
        "3w 2d 12h",       // 3周2天12小时
        "1.5h + 30m",      // 1.5小时加30分钟
        "now + 1d - 30m",  // 当前时间加1天减30分钟
    ];
    
    for expr in expressions {
        match parse(expr) {
            Ok(ts) => println!("'{}' => {}秒", expr, ts.to_seconds()),
            Err(e) => println!("解析'{}'失败: {}", expr, e),
        }
    }
}

错误处理

use fundu_core::parse;
use fundu_core::error::ParseError;

fn main() {
    let result = parse("invalid time string");
    
    if let Err(ParseError::SyntaxError { .. }) = result {
        println!("遇到了语法错误");
    }
}

性能建议

  1. 对于重复使用的解析模式,考虑重用解析器实例
  2. 在性能关键路径上避免不必要的字符串分配
  3. 使用parse函数时尽量提供明确的输入格式

fundu-core是一个强大而灵活的时间处理工具,特别适合需要高性能时间解析的Rust应用程序。通过上述示例,您可以快速上手并集成到您的项目中。

完整示例

// 完整示例展示fundu-core的主要功能
use fundu_core::time::TimeSpan;
use fundu_core::{parse, format::format_time};
use fundu_core::error::ParseError;

fn main() {
    // 基本解析示例
    println!("=== 基本时间解析 ===");
    let durations = vec!["1h", "30m", "1h 30m", "90m"];
    for duration in durations {
        match parse(duration) {
            Ok(ts) => println!("'{}' => {}秒", duration, ts.to_seconds()),
            Err(e) => println!("解析'{}'失败: {}", duration, e),
        }
    }

    // 格式化示例
    println!("\n=== 时间格式化 ===");
    let time_spans = vec![
        TimeSpan::from_seconds(3600),    // 1小时
        TimeSpan::from_seconds(5400),    // 1.5小时
        TimeSpan::from_seconds(86400),   // 1天
    ];
    for ts in time_spans {
        println!("{}秒 => {}", ts.to_seconds(), format_time(&ts));
    }

    // 高级解析示例
    println!("\n=== 高级时间解析 ===");
    let complex_exprs = vec![
        "1y 6mo",          // 1年6个月
        "3w 2d 12h",       // 3周2天12小时
        "1.5h + 30m",      // 1.5小时加30分钟
        "now + 1d - 30m",  // 当前时间加1天减30分钟
    ];
    for expr in complex_exprs {
        match parse(expr) {
            Ok(ts) => println!("'{}' => {}秒", expr, ts.to_seconds()),
            Err(e) => println!("解析'{}'失败: {}", expr, e),
        }
    }

    // 错误处理示例
    println!("\n=== 错误处理 ===");
    let invalid_inputs = vec!["", "abc", "1h 2x"];
    for input in invalid_inputs {
        if let Err(e) = parse(input) {
            println!("输入'{}'错误: {}", input, e);
        }
    }
}

这个完整示例展示了fundu-core的主要功能,包括基本时间解析、格式化、高级表达式处理和错误处理。您可以直接运行这个示例来体验fundu-core的各种功能。

回到顶部