#sanitizer #rfc822 #parser #rfc2822 #date-format

rfc822_sanitizer

rfc822/2822 洁化器/标准化器

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日期和时间 分类中

Download history 235/week @ 2024-03-13 326/week @ 2024-03-20 379/week @ 2024-03-27 287/week @ 2024-04-03 162/week @ 2024-04-10 287/week @ 2024-04-17 235/week @ 2024-04-24 204/week @ 2024-05-01 120/week @ 2024-05-08 88/week @ 2024-05-15 123/week @ 2024-05-22 286/week @ 2024-05-29 121/week @ 2024-06-05 306/week @ 2024-06-12 213/week @ 2024-06-19 96/week @ 2024-06-26

770 每月下载量
6 个Crates中使用 (直接使用 3 个)

GPL-3.0+

64KB
2K SLoC

RFC822/2822_sanitizer

pipeline status Build Status Build status Crates.io codecov Dependency Status

文档

一个辅助函数,它会做你想做的,而不是你说的话!

世界上充满了破败的代码,每个人都似乎在重新发明时间。

如果遇到无效的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