5个版本 (3个重大更改)

使用旧的Rust 2015

0.4.1 2021年7月5日
0.4.0 2021年7月5日
0.3.0 2018年10月6日
0.2.0 2018年9月20日
0.1.0 2018年9月15日

#280 in 日期和时间

每月23次下载
用于 hip_validator

Apache-2.0

83KB
2.5K SLoC

完全符合ISO 8601的解析器

处理所有日期和时间解析需求的首选库。

标准支持但未实现的任何表示法都视为错误。

包含Chrono支持。

路线图

当整个标准都得到实现时,将实现1.0.0版本。

  • 日历日期
  • 周日期
  • 序数日期
  • 近似日期
  • 本地时间
  • 全球时间/时区偏移量
  • 时间小数
  • 近似时间
  • 日期时间
  • 持续时间
  • 区间
  • 重复区间

目前Chrono支持非常有限。欢迎贡献,应该是一些低垂的果实。

示例

基础

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支持

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
        )
    );
}

依赖项

~4.5–6MB
~107K SLoC