Почему моя дата RFC 2822 не анализируется хронографом?

Я пишу код для разбора RSS-каналов, но у меня проблемы с RSS-потоком Abstruse Goose. Если вы посмотрите в этом фиде, даты будут закодированы какMon, 06 Aug 2018 00:00:00 UTC. Для меня это похоже на RFC 2822.

Я пытался разобрать его с помощью хронографа 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, который хорошо исправляет плохие ошибки записи (большую часть времени). Я не думаю, что это влияет на парсинг... но кто знает?

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Смещение ТЗ. ПричинаUT как есть, потому что UTC а также UT не совсем одинаковы (у одного есть дополнительные секунды, у другого... четыре варианта! И RFC не определяет, какой из них используется; все они тонко разные).

Другие вопросы по тегам