如何将格式稍有错误的 RFC822 字符串转换为日期?

Posted

技术标签:

【中文标题】如何将格式稍有错误的 RFC822 字符串转换为日期?【英文标题】:How to convert a slightly misformed RFC822 string to a date? 【发布时间】:2020-05-22 17:51:30 【问题描述】:

我的一个来源包含这样的日期字符串:

Fri, 22 May 2020 22:49:06+5:30

这看起来像 RFC 822 date,除了最后一个时区部分。

我尝试使用如下代码将此字符串转换为日期:

let str = "Fri, 22 May 2020 22:49:06+5:30"

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ssZ"

let date = formatter.date(from: str)

我尝试了各种dateFormat 字符串,但最后一行一直返回 nil。

有没有办法使用DateFormatter 将此示例字符串转换为有效日期?

【问题讨论】:

你能不能把字符串中“+”或“-”后面的部分弄成一致——去掉“:”,然后用“0”把它填成四位数字?跨度> 【参考方案1】:

问题是时区部分缺少前导零,没有对应的符号。

一种可能的解决方案是使用正则表达式插入缺失的零

let str = "Fri, 22 May 2020 22:49:06+5:30"
let adjustedString = str.replacingOccurrences(of: "([+-])(\\d:\\d2)", with: "$10$2", options: .regularExpression)

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ssZ"

let date = formatter.date(from: adjustedString)

【讨论】:

非常感谢,这太棒了!

以上是关于如何将格式稍有错误的 RFC822 字符串转换为日期?的主要内容,如果未能解决你的问题,请参考以下文章

[翻译]C#.我该如何分析和转换日期时间的到RFC 822的日期,时间格式(How do I parse and convert DateTi

如何在 Perl 中以 RFC822 格式优雅地打印日期?

将格式为 rfc822 的日期时间复制到 redshift

[翻译]Convert a date to the RFC822 standard for use in RSS feeds(在RSS源中间日期转换成RFC822标准使用)

在 Java 中解析 MIME 发件人 (RFC 822)

Saxon XSLT 2.0 和 RFC 822 日期格式