16 个版本 (8 个破坏性更新)
0.9.2 | 2024 年 3 月 8 日 |
---|---|
0.8.0 | 2023 年 12 月 31 日 |
0.6.0 | 2023 年 9 月 23 日 |
0.4.0 | 2023 年 7 月 30 日 |
0.2.1 | 2022 年 5 月 28 日 |
#28 in 日期和时间
每月 13,043 次下载
在 5 crates 中使用
53KB
1K SLoC
花式持续时间现在以易于消费的库形式存在
“花式持续时间”是持续时间的文本描述。例如,“1h 20m 30s”,可能读作“一小时,二十分钟和三十秒”。持续时间类型中的表达式通过多种方式透明;chrono 和 time crate 支持,以及与 serde 的字符串类型序列化和反序列化。时间支持从年份开始,逐渐细化到纳秒。
这里是 文档。
以下是一些使用示例。您可以选择将类似于持续时间的类型包装在 FancyDuration 结构体中,或者使用允许进行猴子补丁方法的类型,这些方法允许您直接在目标类型上工作。例如,使用 AsFancyDuration 注入 fancy_duration 调用来执行构造(可以格式化或转换为字符串),并使用 ParseFancyDuration 注入 parse_fancy_duration 构造函数以接受字符串到您喜欢的类型。std::time::Duration、time::Duration 和 chrono::Duration 都受支持(某些功能可能需要要求)并且您可以通过实现 AsTimes 特性来使更多类型有资格。
use std::time::Duration;
use fancy_duration::FancyDuration;
pub fn main() {
assert_eq!(FancyDuration(Duration::new(20, 0)).to_string(), "20s");
assert_eq!(FancyDuration(Duration::new(600, 0)).to_string(), "10m");
assert_eq!(FancyDuration(Duration::new(120, 0)).to_string(), "2m");
assert_eq!(FancyDuration(Duration::new(185, 0)).to_string(), "3m 5s");
assert_eq!(FancyDuration::<Duration>::parse("3m 5s").unwrap().duration(), Duration::new(185, 0));
assert_eq!(FancyDuration(Duration::new(185, 0)).to_string(), "3m 5s");
// these traits are also implemented for chrono and time
use fancy_duration::{ParseFancyDuration, AsFancyDuration};
assert_eq!(Duration::new(20, 0).fancy_duration().to_string(), "20s");
assert_eq!(Duration::new(600, 0).fancy_duration().to_string(), "10m");
assert_eq!(Duration::new(120, 0).fancy_duration().to_string(), "2m");
assert_eq!(Duration::new(185, 0).fancy_duration().to_string(), "3m 5s");
assert_eq!(Duration::parse_fancy_duration("3m 5s".to_string()).unwrap(), Duration::new(185, 0));
assert_eq!(Duration::new(185, 0).fancy_duration().to_string(), "3m 5s");
#[cfg(feature = "time")]
{
// also works with time::Duration from the `time` crate
assert_eq!(FancyDuration(time::Duration::new(20, 0)).to_string(), "20s");
assert_eq!(FancyDuration(time::Duration::new(600, 0)).to_string(), "10m");
assert_eq!(FancyDuration(time::Duration::new(120, 0)).to_string(), "2m");
assert_eq!(FancyDuration(time::Duration::new(185, 0)).to_string(), "3m 5s");
assert_eq!(FancyDuration::<time::Duration>::parse("3m 5s").unwrap().duration(), time::Duration::new(185, 0));
assert_eq!(FancyDuration(time::Duration::new(185, 0)).to_string(), "3m 5s");
}
#[cfg(feature = "chrono")]
{
// also works with chrono!
assert_eq!(FancyDuration(chrono::Duration::seconds(20)).to_string(), "20s");
assert_eq!(FancyDuration(chrono::Duration::seconds(600)).to_string(), "10m");
assert_eq!(FancyDuration(chrono::Duration::seconds(120)).to_string(), "2m");
assert_eq!(FancyDuration(chrono::Duration::seconds(185)).to_string(), "3m 5s");
assert_eq!(FancyDuration::<chrono::Duration>::parse("3m 5s").unwrap().duration(), chrono::Duration::seconds(185));
assert_eq!(FancyDuration(chrono::Duration::seconds(185)).to_string(), "3m 5s");
}
}
基准测试
每个间隔测试都会增加将被格式化的东西的数量。第一组解析测试解析一个包含多个项的字符串,其他解析测试在一次迭代中解析一个静态的 5 项集合。
基准测试系统是一个 Ryzen 5900X,64GB RAM,在桌面配置下运行 Linux 6.6.8。
截至 0.9.1
fancy duration format seconds: std
time: [644.13 ps 645.34 ps 646.96 ps]
fancy duration format seconds: time
time: [6.6756 ns 6.6945 ns 6.7181 ns]
fancy duration format seconds: chrono
time: [658.36 ps 658.73 ps 659.15 ps]
fancy duration format minutes: std
time: [666.00 ps 666.50 ps 667.03 ps]
fancy duration format minutes: time
time: [6.6301 ns 6.6324 ns 6.6349 ns]
fancy duration format minutes: chrono
time: [646.99 ps 647.24 ps 647.50 ps]
fancy duration format hours: std
time: [658.35 ps 660.83 ps 662.88 ps]
fancy duration format hours: time
time: [6.5761 ns 6.5792 ns 6.5826 ns]
fancy duration format hours: chrono
time: [648.05 ps 648.38 ps 648.74 ps]
fancy duration format days: std
time: [641.06 ps 641.33 ps 641.62 ps]
fancy duration format days: time
time: [6.5374 ns 6.5410 ns 6.5452 ns]
fancy duration format days: chrono
time: [662.60 ps 665.24 ps 667.41 ps]
fancy duration format weeks: std
time: [641.06 ps 641.32 ps 641.61 ps]
fancy duration format weeks: time
time: [6.7987 ns 6.8158 ns 6.8288 ns]
fancy duration format weeks: chrono
time: [660.01 ps 662.64 ps 665.05 ps]
fancy duration format months: std
time: [641.66 ps 642.02 ps 642.41 ps]
fancy duration format months: time
time: [6.5435 ns 6.5498 ns 6.5573 ns]
fancy duration format months: chrono
time: [672.00 ps 672.39 ps 672.83 ps]
fancy duration parse one: std
time: [332.00 ns 332.48 ns 332.98 ns]
fancy duration parse one: time
time: [346.25 ns 346.58 ns 346.92 ns]
fancy duration parse one: chrono
time: [369.81 ns 371.26 ns 372.65 ns]
fancy duration parse 5 distinct items: std
time: [1.9150 µs 1.9183 µs 1.9214 µs]
fancy duration parse 5 distinct items: time
time: [1.8446 µs 1.8474 µs 1.8503 µs]
fancy duration parse 5 distinct items: chrono
time: [1.8281 µs 1.8311 µs 1.8345 µs]
作者
Erik Hollensbe [email protected]
许可证
MIT
依赖关系
~2.3–4MB
~67K SLoC