iso-8601

Crates.ioiso-8601
lib.rsiso-8601
version0.4.1
sourcesrc
created_at2018-09-15 15:13:50.284488
updated_at2021-07-05 15:54:23.826911
descriptionFully compliant ISO 8601 parser.
homepage
repositoryhttps://hg.sr.ht/~dermetfan/iso-8601
max_upload_size
id84852
size82,199
Robin Stumm (dermetfan)

documentation

README

Fully Compliant ISO 8601 Parser

The go-to library for all your date and time parsing needs.

Any unimplemented notation the standard supports is considered a bug.

Chrono support is included.

Roadmap

Version 1.0.0 will be reached when the entire standard is implemented.

  • calendar dates
  • week dates
  • ordinal dates
  • approximate dates
  • local time
  • global time / time zone offsets
  • time decimal fractions
  • approximate time
  • datetime
  • durations
  • intervals
  • recurring intervals

Chrono support is very limited at the moment. Contributions would very welcome, should be a low-hanging fruit.

Examples

Basics:

use std::str::FromStr;
use iso_8601::*;

assert_eq!(
    Date::from_str("2018-08-02").unwrap(),
    Date::YMD(YmdDate {
        year: 2018,
        month: 8,
        day: 2,
    })
);

assert_eq!(
    LocalTime::from_str("13:42").unwrap(),
    LocalTime {
        naive: HmTime {
            hour: 13,
            minute: 42,
        },
        fraction: 0.,
    }
);

// Parse any date, time, or datetime expression without knowing what it is:

assert_eq!(
    PartialDateTime::from_str("12:30").unwrap(),
    PartialDateTime::Time(ApproxAnyTime::HM(AnyTime::Local(LocalTime {
        naive: HmTime {
            hour: 12,
            minute: 30,
        },
        fraction: 0.,
    })))
);

assert_eq!(
    PartialDateTime::from_str("2018-08").unwrap(),
    PartialDateTime::Date(ApproxDate::YM(YmDate {
        year: 2018,
        month: 8,
    }))
);

assert_eq!(
    PartialDateTime::from_str("20180802T1230").unwrap(),
    PartialDateTime::DateTime(DateTime {
        date: ApproxDate::YMD(YmdDate {
            year: 2018,
            month: 8,
            day: 2,
        }),
        time: ApproxAnyTime::HM(AnyTime::Local(LocalTime {
            naive: HmTime {
                hour: 12,
                minute: 30,
            },
            fraction: 0.,
        }))
    })
);

Chrono support:

extern crate chrono;

use std::str::FromStr;
use iso_8601::*;

fn main() {
    assert_eq!(
        chrono::DateTime::<chrono::Utc>::from(
            DateTime::<Date, GlobalTime>::from_str("2018-08-02T13:42:02Z").unwrap()
        ),
        chrono::DateTime::<chrono::Utc>::from_utc(
            chrono::NaiveDateTime::new(
                chrono::NaiveDate::from_ymd(2018, 8, 2),
                chrono::NaiveTime::from_hms(13, 42, 2)
            ),
            chrono::Utc
        )
    );
}
Commit count: 0

cargo fmt