Rust时间解析库parse_duration的使用:高效转换字符串为时间间隔的实用工具

Rust时间解析库parse_duration的使用:高效转换字符串为时间间隔的实用工具

重要提示

此存储库不再更新。在决定使用它之前,请检查是否有任何问题是无法接受的。特别是,此crate不应与不受信任的输入一起使用。

功能概述

此crate提供了一个函数parse,用于将字符串解析为持续时间。解析器基于systemd.time设定的标准,但对其进行了显著扩展。例如,允许负数、小数和指数。

示例代码

extern crate parse_duration;

use parse_duration::parse;
use std::time::Duration;

// 比一天少一小时
assert_eq!(parse("1 day -1 hour"), Ok(Duration::new(82_800, 0)));
// 使用指数
assert_eq!(parse("1.26e-1 days"), Ok(Duration::new(10_886, 400_000_000)));
// 额外内容将被忽略
assert_eq!(
    parse("Duration: 1 hour, 15 minutes and 29 seconds"),
    Ok(Duration::new(4529, 0))
);

完整示例demo

// 引入必要的库
extern crate parse_duration;

use parse_duration::parse;
use std::time::Duration;

fn main() {
    // 示例1: 基本时间解析
    match parse("2 hours 30 minutes") {
        Ok(duration) => println!("2小时30分钟 = {:?}", duration),
        Err(e) => println!("解析错误: {}", e),
    }

    // 示例2: 使用小数和负数
    match parse("1.5 days -2 hours") {
        Ok(duration) => println!("1.5天减2小时 = {:?}", duration),
        Err(e) => println!("解析错误: {}", e),
    }

    // 示例3: 科学计数法
    match parse("2.5e2 seconds") {
        Ok(duration) => println!("250秒 = {:?}", duration),
        Err(e) => println!("解析错误: {}", e),
    }

    // 示例4: 复杂字符串解析(忽略额外文本)
    match parse("会议持续时间: 1 hour 45 minutes") {
        Ok(duration) => println!("会议持续时间: {:?}", duration),
        Err(e) => println!("解析错误: {}", e),
    }
}

文档

文档可在docs.rs上找到。

最低Rust版本策略

此crate的最低支持rustc版本是1.28.0。

如果最低rustc版本需要提高,将会有一个新的主要版本。例如,如果parse_duration 2.0.0需要rustc 1.28.0,那么parse_duration 2.x.y也将只需要rustc 1.28.0。由于此crate相当简单,在可预见的未来可能不需要提高最低版本。

许可证

此软件根据MIT许可证授权。

贡献

如果有想要修复的错误或想要实现的功能,请随时提交问题或拉取请求。

通过贡献于此项目,您同意根据MIT许可证的条款许可您的代码。


1 回复

Rust时间解析库parse_duration的使用指南

库介绍

parse_duration是一个轻量级的Rust库,专门用于将人类可读的时间间隔字符串解析为标准的Duration类型。该库支持多种时间单位格式,能够高效地将如"2小时30分钟"这样的自然语言描述转换为精确的时间间隔。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
parse_duration = "2.0"

基本使用方法

1. 简单解析示例

use parse_duration::parse;
use std::time::Duration;

fn main() {
    let duration = parse("2 hours 30 minutes").unwrap();
    println!("总秒数: {}", duration.as_secs());
    // 输出: 总秒数: 9000
}

2. 支持的时间单位格式

let examples = vec![
    "1h30m",           // 1小时30分钟
    "2.5 hours",       // 2.5小时
    "90min",           // 90分钟
    "1 day 12 hours",  // 1天12小时
    "3600s",           // 3600秒
    "1w2d",            // 1周2天
];

for example in examples {
    match parse(example) {
        Ok(duration) => println!("'{}' = {}秒", example, duration.as_secs()),
        Err(e) => println!("解析错误: {}", e),
    }
}

3. 错误处理

fn parse_duration_safe(input: &str) -> Result<Duration, String> {
    parse(input).map_err(|e| format!("解析失败: {}", e))
}

// 使用示例
match parse_duration_safe("无效时间字符串") {
    Ok(duration) => println!("解析成功: {:?}", duration),
    Err(e) => println!("{}", e),
}

4. 复杂时间表达式

// 支持复合时间单位
let complex = parse("1 week 3 days 5 hours 10 minutes 30 seconds").unwrap();
println!("复杂时间间隔: {}秒", complex.as_secs());

// 支持小数
let decimal = parse("1.5 hours").unwrap();
println!("1.5小时 = {}秒", decimal.as_secs());

5. 自定义解析选项

use parse_duration::Config;

// 使用严格模式解析
let strict_config = Config::new().strict();
let result = strict_config.parse("1hour"); // 严格模式下需要空格: "1 hour"

// 使用宽松模式(默认)
let relaxed_config = Config::new().relaxed();
let result = relaxed_config.parse("1hour"); // 宽松模式下可以解析

实用技巧

时间计算示例

use std::time::{Duration, Instant};

fn schedule_task(delay_str: &str) {
    let delay = parse(delay_str).expect("无效的时间格式");
    let scheduled_time = Instant::now() + delay;
    
    println!("任务将在 {} 后执行", delay_str);
    // 实际应用中这里可以安排定时任务
}

配置文件解析

use serde::Deserialize;
use std::time::Duration;

#[derive(Deserialize)]
struct Config {
    timeout: String,
    interval: String,
}

impl Config {
    fn timeout_duration(&self) -> Result<Duration, String> {
        parse(&self.timeout).map_err(|e| e.to_string())
    }
    
    fn interval_duration(&self) -> Result<Duration, String> {
        parse(&self.interval).map_err(|e| e.to_string())
    }
}

注意事项

  1. 库支持的时间单位:ns, us, ms, s, sec, second, seconds, m, min, minute, minutes, h, hour, hours, d, day, days, w, week, weeks
  2. 数值可以是整数或浮点数
  3. 单位名称不区分大小写
  4. 建议在生产环境中添加适当的错误处理

这个库特别适合需要从配置文件或用户输入中解析时间间隔的场景,让时间表达更加人性化和易读。

完整示例代码

use parse_duration::parse;
use std::time::Duration;

fn main() {
    // 示例1: 简单时间解析
    println!("=== 简单时间解析示例 ===");
    let duration = parse("2 hours 30 minutes").unwrap();
    println!("2小时30分钟 = {}秒", duration.as_secs());
    
    // 示例2: 多种时间格式支持
    println!("\n=== 多种时间格式示例 ===");
    let time_formats = vec![
        "1h30m",
        "2.5 hours", 
        "90min",
        "1 day 12 hours",
        "3600s",
        "1w2d"
    ];
    
    for format in time_formats {
        match parse(format) {
            Ok(dur) => println!("'{}' = {}秒", format, dur.as_secs()),
            Err(e) => println!("解析'{}'失败: {}", format, e),
        }
    }
    
    // 示例3: 错误处理
    println!("\n=== 错误处理示例 ===");
    match parse("无效时间字符串") {
        Ok(dur) => println!("解析成功: {:?}", dur),
        Err(e) => println!("错误信息: {}", e),
    }
    
    // 示例4: 复杂时间表达式
    println!("\n=== 复杂时间表达式示例 ===");
    let complex_duration = parse("1 week 3 days 5 hours 10 minutes 30 seconds").unwrap();
    println!("复杂时间间隔: {}秒", complex_duration.as_secs());
    
    // 示例5: 小数时间
    let decimal_duration = parse("1.5 hours").unwrap();
    println!("1.5小时 = {}秒", decimal_duration.as_secs());
}
回到顶部