22 个版本 (13 个重大更改)

0.14.4 2024 年 7 月 3 日
0.14.0 2024 年 3 月 17 日
0.13.0 2023 年 11 月 6 日
0.11.0 2023 年 7 月 13 日
0.6.0 2022 年 7 月 5 日

#14 in 日期和时间

Download history 9008/week @ 2024-05-01 9832/week @ 2024-05-08 12430/week @ 2024-05-15 8609/week @ 2024-05-22 9620/week @ 2024-05-29 8858/week @ 2024-06-05 9703/week @ 2024-06-12 8561/week @ 2024-06-19 11336/week @ 2024-06-26 8005/week @ 2024-07-03 8538/week @ 2024-07-10 9884/week @ 2024-07-17 10837/week @ 2024-07-24 11354/week @ 2024-07-31 11055/week @ 2024-08-07 10489/week @ 2024-08-14

45,098 每月下载量
用于 6 个工具包 (3 个直接使用)

MIT 许可证

96KB
1.5K SLoC

speedate

CI Coverage Crates.io

为 Rust 提供快速简单的日期、时间、日期和时间以及持续时间解析。

speedate 是一个宽松† 的 RFC 3339 日期和时间解析器,换句话说,它解析常见的 ISO 8601 格式。

- 所有从 RFC 3339 出发的宽松性都符合 ISO 8601

以下格式受支持

  • 日期: YYYY-MM-DD
  • 时间: HH:MM:SS
  • 时间: HH:MM:SS.FFFFFF 1 到 6 位数字反映在 time.microsecond 中,额外的数字将被忽略
  • 时间: HH:MM
  • 日期时间: YYYY-MM-DDTHH:MM:SS - 所有上述时间格式都适用于时间部分
  • 日期时间:YYYY-MM-DD HH:MM:SS - 允许使用 Tt _ 作为分隔符
  • 日期时间:YYYY-MM-DDTHH:MM:SSZ - 允许使用 Zz 作为时区
  • 日期时间:YYYY-MM-DDTHH:MM:SS+08:00- 允许正负时区,按照 ISO 8601,U+2212 减号 也允许,以及 ascii 减号 - (U+002D)
  • 日期时间:YYYY-MM-DDTHH:MM:SS+0800 - 时区中的冒号 (:) 是可选的
  • 持续时间:PnYnMnDTnHnMnS - ISO 8601 持续时间格式,更多详情请见 维基百科W 表示周也是允许的
  • 持续时间:HH:MM:SS - 上述任何时间格式都可以用来表示持续时间
  • 持续时间:D days, HH:MM:SS - 以 X days 开头的时间,不区分大小写,空格 s, 都是可选的
  • 持续时间:D d, HH:MM:SS - 以 X d 开头的时间,不区分大小写,空格和 , 都是可选的
  • 持续时间:±... - 所示的所有持续时间格式都可以使用 +- 前缀,分别表示正负持续时间

此外,可以使用 Unix 时间戳(秒和毫秒)来创建日期和日期时间。

有关每个结构的更多详情,请参阅 文档

这将是 pydantic-core 的日期时间解析逻辑。

用法

use speedate::{DateTime, Date, Time};

let dt = DateTime::parse_str("2022-01-01T12:13:14Z").unwrap();
assert_eq!(
    dt,
    DateTime {
        date: Date {
            year: 2022,
            month: 1,
            day: 1,
        },
        time: Time {
            hour: 12,
            minute: 13,
            second: 14,
            microsecond: 0,
            tz_offset: Some(0),
        },
    }
);
assert_eq!(dt.to_string(), "2022-01-01T12:13:14Z");

要控制时间解析的具体细节,可以提供一个 TimeConfig

use speedate::{DateTime, Date, Time, TimeConfig, MicrosecondsPrecisionOverflowBehavior};
let dt = DateTime::parse_bytes_with_config(
    "1689102037.5586429".as_bytes(),
    &TimeConfig::builder()
        .unix_timestamp_offset(Some(0))
        .microseconds_precision_overflow_behavior(MicrosecondsPrecisionOverflowBehavior::Truncate)
        .build(),
).unwrap();
assert_eq!(
    dt,
    DateTime {
        date: Date {
            year: 2023,
            month: 7,
            day: 11,
        },
        time: Time {
            hour: 19,
            minute: 0,
            second: 37,
            microsecond: 558643,
            tz_offset: Some(0),
        },
    }
);
assert_eq!(dt.to_string(), "2023-07-11T19:00:37.558643Z");

性能

speedate 比chrono的 parse_from_rfc3339 和 iso8601 领先很多。

来自 benches/main.rs 的微基准测试

test datetime_error_speedate ... bench:           6 ns/iter (+/- 0)
test datetime_error_chrono   ... bench:          50 ns/iter (+/- 1)
test datetime_error_iso8601  ... bench:         118 ns/iter (+/- 2)
test datetime_ok_speedate    ... bench:           9 ns/iter (+/- 0)
test datetime_ok_chrono      ... bench:         182 ns/iter (+/- 0)
test datetime_ok_iso8601     ... bench:          77 ns/iter (+/- 1)
test duration_ok_speedate    ... bench:          23 ns/iter (+/- 0)
test duration_ok_iso8601     ... bench:          48 ns/iter (+/- 0)
test timestamp_ok_speedate   ... bench:           9 ns/iter (+/- 0)
test timestamp_ok_chrono     ... bench:          10 ns/iter (+/- 0)

为什么不是完整的 ISO8601?

ISO8601 允许许多格式,请参阅 ijmacd.github.io/rfc3339-iso8601

大多数用户对这些都不知情,也不希望看到。这个库旨在支持最常见的格式,而不引入歧义。

依赖项

~305–770KB
~18K SLoC