【问题标题】:Why is my RFC 2822 date not parsed by chrono?为什么我的 RFC 2822 日期没有被 chrono 解析?
【发布时间】:2020-01-13 13:44:59
【问题描述】:

我正在编写一些代码来解析 RSS 提要,但我在使用 Abstruse Goose RSS feed 时遇到了问题。 如果您查看该提要,日期编码为Mon, 06 Aug 2018 00:00:00 UTC。对我来说,它看起来像 RFC 2822。

我尝试使用 chrono 的 DateTime::parse_from_rfc2822 解析它,但我得到了 ParseError(NotEnough)

let pub_date = entry.pub_date().unwrap().to_owned();
return rfc822_sanitizer::parse_from_rfc2822_with_fallback(&pub_date)
    .unwrap_or_else(|e| {
        panic!(
            "pub_date for item {:?} (value is {:?}) can't be parsed due to error {:?}",
            &entry, pub_date, e
        )
    })
    .naive_utc();

我做错了什么吗?我必须以某种方式破解它吗?

我使用rfc822_sanitizer,它可以很好地修复错误的书写错误(大部分时间)。我认为它不会影响解析...但谁知道呢?

【问题讨论】:

  • 显示一些 Rust 代码,以便其他人可以重现您的问题。
  • Mon, 06 Aug 2018 00:00:00 UTC 绝对不是 RFC2822 格式的时间戳。 RFC2822 中指定的in the doc(搜索obs-zone)中UTC 的有效符号是UT,而不是UTC
  • @SébastienRenauld 该死的......它会成为 rfc822 sanitizer 扩展的候选者吗?
  • 可能。这是人们试图推出自己的日期时间生成器的一个已知问题,tbh。他们看到“GMT”,他们认为这将是“UTC”,而现实是世界时的真实时区是世界时。关于这个名字有很多背景故事
  • 无论如何。尝试用“UT”替换“UTC”,再试一次,如果它有效,请告诉我。如果是这样,我会写一个包含所有琐事的答案

标签: date rust rfc2822 rust-chrono


【解决方案1】:

RFC2822 日期/时间格式在 RFC 中被很好地编码为以下格式:

date-time       =       [ day-of-week "," ] date FWS time [CFWS]
day-of-week     =       ([FWS] day-name) / obs-day-of-week
day-name        =       "Mon" / "Tue" / "Wed" / "Thu" /
                        "Fri" / "Sat" / "Sun"
date            =       day month year
year            =       4*DIGIT / obs-year
month           =       (FWS month-name FWS) / obs-month
month-name      =       "Jan" / "Feb" / "Mar" / "Apr" /
                        "May" / "Jun" / "Jul" / "Aug" /
                        "Sep" / "Oct" / "Nov" / "Dec"
day             =       ([FWS] 1*2DIGIT) / obs-day
time            =       time-of-day FWS zone
time-of-day     =       hour ":" minute [ ":" second ]
hour            =       2DIGIT / obs-hour
minute          =       2DIGIT / obs-minute
second          =       2DIGIT / obs-second
zone            =       (( "+" / "-" ) 4DIGIT) / obs-zone

其中obs-zone定义如下:

obs-zone        =       "UT" / "GMT" /          ; Universal Time
                                                ; North American UT
                                                ; offsets
                        "EST" / "EDT" /         ; Eastern:  - 5/ - 4
                        "CST" / "CDT" /         ; Central:  - 6/ - 5
                        "MST" / "MDT" /         ; Mountain: - 7/ - 6
                        "PST" / "PDT" /         ; Pacific:  - 8/ - 7
                        %d65-73 /               ; Military zones - "A"
                        %d75-90 /               ; through "I" and "K"
                        %d97-105 /              ; through "Z", both
                        %d107-122               ; upper and lower case

很多人在滚动他们自己的时间戳生成库时会出错,这就是这一点——如何正确标记RFC2822 TZ 偏移量。 UT 之所以如此,是因为 UTCUT 并不完全相同(一个有额外的秒数,另一个有......四个变体!而且 RFC 没有定义使用哪一个;他们'都是微妙的不同)。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2010-10-27
    • 2012-12-08
    • 2012-01-28
    • 2011-03-28
    • 2013-05-15
    • 1970-01-01
    • 2015-12-04
    • 2011-07-11
    相关资源
    最近更新 更多