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())
}
}
注意事项
- 库支持的时间单位:ns, us, ms, s, sec, second, seconds, m, min, minute, minutes, h, hour, hours, d, day, days, w, week, weeks
- 数值可以是整数或浮点数
- 单位名称不区分大小写
- 建议在生产环境中添加适当的错误处理
这个库特别适合需要从配置文件或用户输入中解析时间间隔的场景,让时间表达更加人性化和易读。
完整示例代码
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());
}