9个版本
0.3.6 | 2022年1月11日 |
---|---|
0.3.4 | 2020年8月17日 |
0.3.3 | 2017年11月5日 |
0.3.2 | 2017年10月7日 |
0.1.2 | 2017年9月28日 |
#94 在 日期和时间 分类中
770 每月下载量
在 6 个Crates中使用 (直接使用 3 个)
64KB
2K SLoC
RFC822/2822_sanitizer
一个辅助函数,它会做你想做的,而不是你说的话!
世界上充满了破败的代码,每个人都似乎在重新发明时间。
如果遇到无效的rfc822/2822时间,它将首先尝试修复,然后返回错误。
这个Crates的宗旨是尝试修复那些做类似这样事情的生成器的混乱
Thu, 05Aug2016 06:00:00 -0400
Mon, 31July2017 16:00:00 PDT
Wed, 20Sep2017 10:00:00 -0000
30Aug2017 1:30:00 PDT
以上所有看起来都很正常。但它们都是无效的,并且无法用 chrono::Datetime::parse_from_rfc2822
解析
沙盒链接 链接.
Err(ParseError(Impossible))
Err(ParseError(Invalid))
Err(ParseError(NotEnough))
Err(ParseError(Invalid))
-
第一个
Thu, 05 Aug 2016 06:00:00 -0400
实际上是星期五。 -
第二个
Mon, 31 July 2017 16:00:00 PDT
使用了完整的月份名称。 -
第三个
Wed, 20 Sep 2017 10:00:00 -0000
使用-0000作为时区,这是一种未定义的行为。更多信息请参阅 #102。 -
第四个
30 Aug 2017 1:30:00 PDT
使用单数字表示小时。
在尝试解析来自网络荒野的RSS源时遇到了上述日期。
RSS规范 指定使用RFC822作为日期格式,它与RFC2822向前兼容。这一事实证明了人们/生成器仍然在使用1982年发布的格式出错。
如果我们使用清洗器,实际上会得到正确的日期和时间。
用法
将以下内容添加到您的Cargo.toml中。
[dependencies]
rfc822_sanitizer = "0.3"
来自 examples/simple.rs
extern crate rfc822_sanitizer;
use rfc822_sanitizer::parse_from_rfc2822_with_fallback;
fn main() {
let dates = vec![
"Thu, 05 Aug 2016 06:00:00 -0400",
"Mon, 31 July 2017 16:00:00 PDT",
"Wed, 20 Sep 2017 10:00:00 -0000",
"30 Aug 2017 1:30:00 PDT",
];
for foo in dates.iter() {
let fallback = parse_from_rfc2822_with_fallback(&foo);
println!("{:?}", fallback);
}
}
输出
Ok(2016-08-05T06:00:00-04:00)
Ok(2017-07-31T16:00:00-07:00)
Ok(2017-09-20T10:00:00+00:00)
Ok(2017-08-30T01:30:00-07:00)
但请注意,这会消耗更多资源。
$ cargo +nightly bench -q
running 4 tests
test bench_correct_dates_normal_parse ... bench: 20,741 ns/iter (+/- 1,000)
test bench_correct_dates_with_fallback ... bench: 21,133 ns/iter (+/- 282)
test bench_parse_invalid_dates_with_fallback ... bench: 119,116 ns/iter (+/- 3,706)
test mixed_sample_case ... bench: 431,814 ns/iter (+/- 8,526)
依赖项
~3–4.5MB
~71K SLoC