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

问题描述

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

解决方法

Chrono 没有任何功能来完成这项工作。

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

extern crate parse_duration;
use parse_duration::parse;

fn main() {
    print!("{:?}",parse("2 minutes"));
}
Ok(120s)

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

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

如果您想直接使用chrono crate,则需要进行大量计算才能将持续时间转化为数字表示。我会在 parse_duration 中查看 parse 的来源。


一种解决方法是计算两个 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);
    let tm2 = d.and_hms(0,2,0);
    let delta: Duration = tm2.signed_duration_since(tm1);
    print!("{:?}",delta);
}
Duration { secs: 120,nanos: 0 }