【问题标题】:Swift: Date can't parse "yyyy-MM-dd'T'HH:mm:ss" StringSwift:日期无法解析“yyyy-MM-dd'T'HH:mm:ss”字符串
【发布时间】:2020-03-29 17:58:56
【问题描述】:

我目前正在尝试调用 Api,然后它会返回一些信息以及更改日期。之后我想以“dd.MM.yyyy”格式显示日期。我从 Api 获得的日期如下所示:“2020-03-20T19:30:00”。因此,我在这个问题中使用了解决方案:How to get time from YYYY-MM-dd'T'HH:mm:ss.sssZ 使其看起来像我想要的格式。

不幸的是,当我尝试解析从 Api 获得的日期时,我总是得到一个 nil 值。

我写的代码如下:

let inputFormatter : DateFormatter = DateFormatter()
inputFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let dateFormatter : DateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"

//date is always nil 
let date = inputFormatter.date(from: content?.DateTime ?? "2020-03-20T19:30:00")

dateLabel.text = dateFormatter.string(from: date ?? Date())

有人知道为什么我总是得到一个 nil 值,以及我转换日期的方式是好还是坏?

【问题讨论】:

  • 是的,将inputFormatter 的locale 设置为en_US_POSIX 是个好主意。或者,更好的是使用ISO8601DateFormatter,它会处理所有这些,而不是DateFormatter,然后您就不必设置locale 或dateFormat。
  • @Rob ISO8601DateFormatter 在最后没有时区Z 将无法工作
  • 正如 Rob 刚才提到的,根据用户的设备区域设置和设置显示您的日期stackoverflow.com/questions/28332946/…
  • @LeoDabus 当然。但它是适用于 iOS 11 及更高版本的工作的正确工具。
  • 顺便说一句,在没有时区限定符的情况下,有点不清楚这代表什么时区(例如,格林威治标准时间晚上 7:30,本地时间晚上 7:30,服务器时区的晚上 7:30?)。根据定义,ISO8601 字符串假定在没有时区限定符的情况下(例如,Z),它位于您的本地时区。但大多数 Web 服务通常以 GMT/UTC/Zulu 报告日期字符串。您可能想要准确地确认您的 Web 服务在做什么。如果这是您自己的 Web 服务,您可能会考虑转而使用带有时区信息的完全合格的 ISO 8601/RFC 3339 日期字符串。

标签: swift date


【解决方案1】:

@Leo Dabus 给出了很好的分数。有趣的是,我已经使用字符串“2020-03-20T19:30:00”在操场上测试了您的代码,即使没有设置语言环境,它也能完美运行。我认为content?.DateTime 有问题。您可能应该使用的示例代码:

`

let dateFormatter : DateFormatter = DateFormatter()
let locale = Locale(identifier: "en_US_POSIX")

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.locale = locale

guard let date = dateFormatter.date(from: "2020-03-20T19:30:00") else {
  fatalError("Could not create date")
}
print(date)

`

【讨论】:

  • 感谢大家指出问题。导致此问题的原因是 content.DateTime。在我的代码中,这个变量是一个可选值。在我解开这个值之后,日期被正确读取。也许你们中的一些人解释了为什么可选值导致 nil 值。但正如@Rob 所说,我将来会尝试使用 ISO8601DateFormatter。
  • ModernMantra - “在操场上测试了你的代码......即使没有设置语言环境,它也能完美运行”......当然,它可能在你的特定设备上运行良好,但在不同的设备上运行不同的语言环境,如果您不手动将格式化程序的locale 设置为en_US_POSIX,它仍然会失败。如果您使用 DateFormatter 解析 ISO 8601 或 RFC 3339 日期字符串,则必须设置 locale 以确保无论设备设置如何都能正常工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
相关资源
最近更新 更多