Build Status docs.rs crates.io

iso8601-duration

Parse ISO8601 duration format.

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

Installation

toml iso8601-duration = "0.2.0"

Usage

```rust use iso8601_duration::Duration;

asserteq!( "P3Y6M4DT12H30M5S".parse(), Ok(Duration::new(3., 6., 4., 12., 30., 5.)) ); asserteq!("P23DT23H".parse::().unwrap().numhours(), Some(575.)); asserteq!("P0.5Y".parse::().unwrap().numyears(), Some(0.5)); asserteq!("P0.5Y0.5M".parse::().unwrap().nummonths(), Some(6.5)); asserteq!("P12W".parse::().unwrap().num_days(), Some(84.));

assert!("PT".parse::().iserr()); assert!("P12WT12H30M5S".parse::().iserr()); assert!("P0.5S0.5M".parse::().iserr()); assert!("P0.5A".parse::().iserr()); ```

year and month

Duration can be converted to either std::time::Duration or chrono::Duration by calling to_std or to_chrono.

Both to_std and to_chrono will return None if the duration includes year and month. Because ISO8601 duration format allows the usage of year and month, and these durations are non-standard. Since months can have 28, 29 30, 31 days, and years can have either 365 or 366 days.

To perform a lossless conversion, a starting date must be specified:

``rust // requireschrono` feature

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

let onemonth: Duration = "P1M".parse().unwrap(); let date = DateTime::parsefromrfc3339("2000-02-01T00:00:00Z").unwrap(); asserteq!( onemonth.tochronoatdatetime(date).num_days(), 29 // 2000 is a leap year ); ```

License: MIT