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 日期和时间

Download history 1860/week @ 2024-03-28 2402/week @ 2024-04-04 3587/week @ 2024-04-11 2539/week @ 2024-04-18 1931/week @ 2024-04-25 1996/week @ 2024-05-02 2515/week @ 2024-05-09 2953/week @ 2024-05-16 2378/week @ 2024-05-23 3252/week @ 2024-05-30 3002/week @ 2024-06-06 2276/week @ 2024-06-13 3301/week @ 2024-06-20 3121/week @ 2024-06-27 4082/week @ 2024-07-04 2291/week @ 2024-07-11

每月 13,043 次下载
5 crates 中使用

MIT 许可证

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