如何使用 Chrono 解析 ISO 8601 持续时间字符串?

pra*_*ent 8 duration rust rust-chrono

虽然chrono支持以 ISO 8601 兼容格式解析日期、时间和时区,但我无法在 crate 中找到任何方法来解析持续时间字符串,例如PT2M表示 2 分钟的字符串。

Kap*_*lan 4

Chrono 没有任何函数来完成这项工作。

相反,使用parse_duration箱来解决问题:

extern crate parse_duration;
use parse_duration::parse;

fn main() {
    print!("{:?}", parse("2 minutes"));
}
Run Code Online (Sandbox Code Playgroud)
Ok(120s)
Run Code Online (Sandbox Code Playgroud)

此外,没有任何函数可以将 ISO 8601 快捷方式转换为 chrono 或 parse_duration 包的表示形式。

如果您使用 parse_duration 箱,您需要编写一个解析器,将快捷方式转换PT2M为人类可读的形式,例如。2 minutes

如果您想直接使用 chrono crate,则需要进行大量计算才能将持续时间转换为数字表示形式。我会研究一下parseparse_duration 的来源。


一种解决方法是计算两秒的持续时间NaiveDate

extern crate chrono;
use chrono::{Duration, NaiveDate};

fn main() {
    let d = NaiveDate::from_ymd(2021, 8, 2);
    let tm1 = d.and_hms(0, 0, 0);
    let tm2 = d.and_hms(0, 2, 0);
    let delta: Duration = tm2.signed_duration_since(tm1);
    print!("{:?}", delta);
}
Run Code Online (Sandbox Code Playgroud)
Duration { secs: 120, nanos: 0 }
Run Code Online (Sandbox Code Playgroud)

  • @Kaplan 感谢您的参考。不幸的是,软件包不再有更新通知。我引用 chrono 的原因是它几乎具有解析 ISO8601 持续时间的功能。我非常希望限制我的依赖。 (2认同)