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 日期和时间
45,098 每月下载量
用于 6 个工具包 (3 个直接使用)
96KB
1.5K SLoC
speedate
为 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
- 允许使用T
,t
,_
作为分隔符 - 日期时间:
YYYY-MM-DDTHH:MM:SSZ
- 允许使用Z
或z
作为时区 - 日期时间:
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