【问题标题】:How do I parse a date from RFC2822 allowing a time zone at the end of the string?如何解析 RFC2822 中的日期,允许在字符串末尾使用时区?
【发布时间】:2022-12-10 21:00:22
【问题描述】:

我正在尝试解析邮件标题。我正在尝试通过给它 RFC2822 strings 来解析 Chrono 的日期。问题是它无法解析格式为2 Nov 2021 14:26:12 +0000 (UTC) 的字符串,问题似乎是最后一部分 (UTC)。我怎样才能让 Chrono 也解析这些字符串?

use chrono::prelude::DateTime; // 0.4.19
use regex::Regex;              // 1.6.0

let date = "2 Nov 2021 14:26:12 +0000"; // does work
let date = "2 Nov 2021 14:26:12 +0000 (UTC)"; // does not work

// regex parses "[+-]dddd (www)" => " "[+-]dddd"
let re = Regex::new(r"([+-]?\d{4}) \(\w+\)$").unwrap();
let date = DateTime::parse_from_rfc2822(
        &re.replace(date_rfc2822_str, "$1")
    )
    .unwrap()
);

我可以使用正则表达式只删除最后一部分,但是否可以在没有这种“hack”的情况下解析它?

【问题讨论】:

  • 你尝试过什么了吗?如果是,我们可以看到您的代码吗?
  • 我添加了一个代码示例
  • 2 Nov 2021 14:26:12 +0000 (UTC) 是否符合任何标准?还是只是 RFC2822 附加了其他内容?
  • 来自their code的官方引述:我们不识别折叠空格 (FWS) 或注释 (CFWS)。相反,出于我们的目的,我们接受任何 Unicode 空白字符序列(此处表示为 S)。任何实际的 RFC 2822 解析器都应该自己解析 FWS 和/或 CFWS 并将其替换为单个 SP (%x20);这是合法的。
  • @fevar 一旦我通过评论,它就会起作用。开发人员认识到并接受这是不正确的行为,我们需要实现与 rfc2822 cmets 的兼容性。在合并之前,您可以在您的Cargo.toml:chrono = { git = "https://github.com/Finomnis/chrono.git", branch = "rfc2822_comments" }中使用它

标签: rust rfc2822 rust-chrono


【解决方案1】:

这个was a bug in chrono

got fixed 并且可能会在计时版本0.4.20 中发布。

use chrono::prelude::DateTime; // main branch

fn main() {
    let date = "2 Nov 2021 14:26:12 +0000 (UTC)";
    println!("{}", DateTime::parse_from_rfc2822(date).unwrap());
}
2021-11-02 14:26:12 +00:00

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多