【问题标题】:DateFormatter date from string returns nil when iPhone Date & Time 24-Hour Time is off [duplicate]当 iPhone 日期和时间 24 小时制关闭时,字符串中的 DateFormatter 日期返回 nil [重复]
【发布时间】:2020-03-05 16:30:30
【问题描述】:

我正在开发一个从后端返回的字符串初始化日期的应用程序。使用以下格式返回 dateString:"2020-03-05T09:00:00+00:00"

我必须进行转换的方法是:

extension Date {
    static func convertDate(_ dateString: String?) -> Date? {
        guard let dateString = dateString else { return nil }

        let dateFormatter = DateFormatter()

        dateFormatter.setLocalizedDateFormatFromTemplate("yyyy-MM-dd'T'HH:mm:ssZZZZZ")
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"

        return dateFormatter.date(from: dateString)
    }

}

一切正常,直到有人报告说如果用户在设置中关闭 “24 小时制”,上述方法将返回 nil。

我做错了什么?

谢谢

【问题讨论】:

  • 嗨,我尝试运行此代码,但在“dateFormatter.setLocalizedDateFormatFromTemplate(Date.dateFormatterLocale)”行出现错误,特别是 dateFormatterLocale 不是 Date 的成员。这是你在别处创造的东西吗?我试图将其更改为 dateFormatter.locale 但这又给出了另一个错误。
  • 您需要将 dateFormatter 语言环境设置为“en_US_POSIX”。 使用固定格式日期时,例如 RFC 3339,您可以设置 dateFormat 属性来指定格式字符串。对于大多数固定格式,您还应该将 locale 属性设置为 POSIX 语言环境(“en_US_POSIX”),并将 timeZone 属性设置为 UTC。 developer.apple.com/documentation/foundation/dateformatter
  • 对不起,你是对的。这是一个常数......
  • 删除dateFormatter.setLocalizedDateFormatFromTemplate。你不需要它
  • 如果您还从日期创建时间戳,则应将时区设置为 UTC

标签: swift


【解决方案1】:

您使用的是一种非常标准化的时间戳格式,它允许您利用ISO8601DateFormatter

let dateString = "2020-03-05T09:00:00+00:00"

let df = ISO8601DateFormatter()
df.formatOptions = [.withInternetDateTime]

if let date = df.date(from: dateString) {
    print(date) // 2020-03-05 09:00:00 +0000
}

如果一台机器(如您的服务器)正在生成时间戳,那么它将(应该)始终采用祖鲁时间 (GMT),因此您无需执行任何其他操作。您可以指定一个时区,但没有意义,因为字符串总是会为您清零。

df.timeZone = TimeZone(secondsFromGMT: 0)

这个字符串代表一个绝对的时刻。如果您需要一个相对的时间点,例如来源的当地时间,您需要识别该时区并在此处应用,这也非常简单。

【讨论】:

  • 这绝对是一个重复的问题。 StackOverflow 上已经有太多关于这个话题的问题了
  • 请注意 ISODateFormatter 它仅适用于 iOS 11 或更高版本
  • 正如我在 cmets 中已经提到的,默认设置应该可以工作。 df.formatOptions = [.withInternetDateTime] 不需要
  • 使用此方法创建时间戳时,结果字符串的时区表示将与原始字符串不同。它将使用 Z 表示 UTC 而不是 +00:00。意思相同但不一致
  • 问题已被标记为重复,但 ISO8601DateFormatter 可以直接解决问题。
猜你喜欢
  • 2021-05-05
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
相关资源
最近更新 更多