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 • Rust 包仓库 235/week @ 2024-03-13 • Rust 包仓库 326/week @ 2024-03-20 • Rust 包仓库 379/week @ 2024-03-27 • Rust 包仓库 287/week @ 2024-04-03 • Rust 包仓库 162/week @ 2024-04-10 • Rust 包仓库 287/week @ 2024-04-17 • Rust 包仓库 235/week @ 2024-04-24 • Rust 包仓库 204/week @ 2024-05-01 • Rust 包仓库 120/week @ 2024-05-08 • Rust 包仓库 88/week @ 2024-05-15 • Rust 包仓库 123/week @ 2024-05-22 • Rust 包仓库 286/week @ 2024-05-29 • Rust 包仓库 121/week @ 2024-06-05 • Rust 包仓库 306/week @ 2024-06-12 • Rust 包仓库 213/week @ 2024-06-19 • Rust 包仓库 96/week @ 2024-06-26 • Rust 包仓库

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