Swift“字符串中的日期”转换不起作用,但格式适用于在线服务?

Posted

技术标签:

【中文标题】Swift“字符串中的日期”转换不起作用,但格式适用于在线服务?【英文标题】:Swift "date from string" conversion doesn't work but the format works with online service? 【发布时间】:2018-08-03 09:16:44 【问题描述】:

游乐场代码:

var dateStr = "Fri, 03 Aug 2018 08:55:22 GMT"
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.setLocalizedDateFormatFromTemplate("EEE, dd MMM yyyy HH:mm:ss z")
let date = dateFormatter.date(from: dateStr)

同时我使用online service - 它表明我选择的格式是正确的。我的错在哪里?

【问题讨论】:

dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"? 【参考方案1】:

当您使用DateFormatter 时的小提示,如果它不能以一种方式工作,那么就以另一种方式进行:

let string = dateFormatter.string(from: Date())
print("string: \(string)")

这样您将看到您的格式是如何被真正解释的。

如果你这样做,你会得到:

$> string: Fri, Aug 03, 2018, 12:05:09 GMT

查看额外的 ,Aug 0303 Aug

现在,你的问题是你误解了localizedDateFormatFromTemplate

事实上,您可以删除空格、标点符号和顺序。 例如,dateFormatter.setLocalizedDateFormatFromTemplate("ddyyyyHHmmsszEMMM") 给出相同的输出。

你只需要给它你想要的信息(日、年、月等),它就会在本地化版本中创建正确的dateFormat(然后添加额外的标点符号等)。

所以改用:

dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"

旁注: 我目前住在 GMT+2,所以我添加了dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) 以使其正常工作。

【讨论】:

【参考方案2】:

您必须提供dateFormatter.dateFormat 才能将字符串转换为日期格式。从评论中你得到了答案,但对于其他人,我在这里发布了一个正确的答案。

var dateStr = "Fri, 03 Aug 2018 08:55:22 GMT"
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z" //Added this line.
let date = dateFormatter.date(from: dateStr)

【讨论】:

setLocalizedDateFormatFromTemplate 是多余的

以上是关于Swift“字符串中的日期”转换不起作用,但格式适用于在线服务?的主要内容,如果未能解决你的问题,请参考以下文章

为啥类型转换在 Swift 2.0 中不起作用?

枚举中的类型转换在 Swift 中不起作用

Swift 自定义转换不起作用(未调用 UIViewControllerTransitioningDelegate)

Swift 4 NSPredicate 日期格式不起作用

SWIFT:从文本字段格式化为日期不起作用

尽管列为可用格式,但将 ogg 转换为 wav 不起作用