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 回复
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!("遇到了语法错误");
}
}
性能建议
- 对于重复使用的解析模式,考虑重用解析器实例
- 在性能关键路径上避免不必要的字符串分配
- 使用
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的各种功能。