Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I parse ISO 8601 duration strings using Chrono?

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.

like image 428
praveent Avatar asked Apr 28 '26 02:04

praveent


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 }
like image 56
Kaplan Avatar answered Apr 30 '26 02:04

Kaplan


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

You can use iso8601-duration crate instead.

like image 40
Pascal Pixel Rigaux Avatar answered Apr 30 '26 02:04

Pascal Pixel Rigaux