temporal_core 0.0.1

An Intl-first date time library
Documentation
mod calendar;
mod duration;
mod iso;
mod plain;
mod timezone;
mod zoned;

pub use calendar::{Calendar, CalendarProtocol, Era};
pub use plain::PlainDate;
pub use zoned::ZonedDateTime;
pub use timezone::{TimeZone, TimeZoneProtocol};
pub use duration::{SignedDuration, NominalDuration};
pub use iso::{IsoDate, IsoTime};

#[cfg(test)]
mod tests {
    use std::str::FromStr;

    use crate::{
        zoned::{ZonedDateTime, ZonedDateTimeParseError},
        Calendar, PlainDate,
    };

    #[test]
    fn parse_plain_date_simple() {
        let result: PlainDate = "2022-02-02".parse().unwrap();
        assert_eq!(result.year(), 2022);
    }

    #[test]
    fn parse_zoned_simple() {
        let result: ZonedDateTime = "2022-09-01T00:00Z[Asia/TehrAn]".parse().unwrap();
        assert_eq!(result.year(), 2022);
        assert_eq!(result.month(), 9);
        assert_eq!(result.day(), 1);
        assert_eq!(result.hour(), 4);
        assert_eq!(result.minute(), 30);
        let result2: ZonedDateTime = "2122-04-01T07:12Z[+03:00]".parse().unwrap();
        assert_eq!(result2.year(), 2122);
        assert_eq!(result2.month(), 4);
        assert_eq!(result2.day(), 1);
        assert_eq!(result2.hour(), 10);
        assert_eq!(result2.minute(), 12);
        let result3: ZonedDateTime = "1853-04-01T00:00Z[UTC]".parse().unwrap();
        assert_eq!(result3.year(), 1853);
        assert_eq!(result3.month(), 4);
        assert_eq!(result3.day(), 1);
        assert_eq!(result3.hour(), 0);
        assert!(matches!(
            ZonedDateTime::from_str("2022-09-01T00:00+04[+04:30]"),
            Err(ZonedDateTimeParseError::WrongOffset),
        ));
    }

    #[test]
    fn from_ymd_constraint() {
        let result = PlainDate::from_ymd(2000, 13, 2, Calendar::Iso8601).constrain();
        assert_eq!(result.month(), 12);
    }
}