How do I parse ISO 8601 duration strings using Chrono?

Viewed 1008

While chrono supports parsing of date, time and time zone in ISO 8601 compliant format, I am unable to find any method in the crate to parse duration strings such as PT2M which represents 2 minutes.

2 Answers

Chrono doesn't have any function to do this job.

Instead, use the parse_duration crate to solve the problem:

extern crate parse_duration;
use parse_duration::parse;

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

Furthermore, there isn't any function that converts ISO 8601 shortcuts into a representation for the chrono or parse_duration crate.

You need to write a parser that transforms the shortcuts like PT2M into a human readable form like 2 minutes, if you work with the parse_duration crate.

If you want to use the chrono crate directly, you have a lot of calculation to do to put the duration into a numeric representation. I would take a look into the sources of parse in parse_duration.


One workaround could be to calculate the duration out of two NaiveDates:

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);
}
Duration { secs: 120, nanos: 0 }

Chrono doesn't have any function to do this job.

You can use iso8601-duration crate instead.

Related