2 个不稳定版本

0.2.0 2023 年 3 月 19 日
0.1.0 2019 年 10 月 1 日

日期和时间 中排名 219

Download history 2879/week @ 2024-03-14 2831/week @ 2024-03-21 1997/week @ 2024-03-28 2370/week @ 2024-04-04 2600/week @ 2024-04-11 3029/week @ 2024-04-18 2811/week @ 2024-04-25 2797/week @ 2024-05-02 3218/week @ 2024-05-09 3756/week @ 2024-05-16 3474/week @ 2024-05-23 3700/week @ 2024-05-30 3684/week @ 2024-06-06 3262/week @ 2024-06-13 3255/week @ 2024-06-20 3506/week @ 2024-06-27

每月下载量 14,500
6 包中使用(直接使用 2 个)

MIT 许可证

19KB
365

Build Status docs.rs crates.io

iso8601-duration

解析 ISO8601 持续时间格式。

https://en.wikipedia.org/wiki/ISO_8601#Durations

安装

iso8601-duration = "0.2.0"

用法

use iso8601_duration::Duration;

 assert_eq!(
     "P3Y6M4DT12H30M5S".parse(),
     Ok(Duration::new(3., 6., 4., 12., 30., 5.))
 );
 assert_eq!("P23DT23H".parse::<Duration>().unwrap().num_hours(), Some(575.));
 assert_eq!("P0.5Y".parse::<Duration>().unwrap().num_years(), Some(0.5));
 assert_eq!("P0.5Y0.5M".parse::<Duration>().unwrap().num_months(), Some(6.5));
 assert_eq!("P12W".parse::<Duration>().unwrap().num_days(), Some(84.));

 assert!("PT".parse::<Duration>().is_err());
 assert!("P12WT12H30M5S".parse::<Duration>().is_err());
 assert!("P0.5S0.5M".parse::<Duration>().is_err());
 assert!("P0.5A".parse::<Duration>().is_err());

yearmonth

Duration 可以通过调用 to_stdto_chrono 转换为 std::time::Durationchrono::Duration

如果持续时间包含 yearmonth,则 to_stdto_chrono 将返回 None。因为 ISO8601 持续时间格式允许使用 yearmonth,而这些持续时间是非标准的。由于月份可以有 28、29、30 或 31 天,而年份可以是 365 或 366 天。

为了进行无损转换,必须指定起始日期

// requires `chrono` feature

use iso8601_duration::Duration;
use chrono::DateTime;

let one_month: Duration = "P1M".parse().unwrap();
let date = DateTime::parse_from_rfc3339("2000-02-01T00:00:00Z").unwrap();
assert_eq!(
    one_month.to_chrono_at_datetime(date).num_days(),
    29 // 2000 is a leap year
);

许可证:MIT

依赖项

~0.9–1.5MB
~28K SLoC