【问题标题】:Swift ISO8601 format to DateSwift ISO8601 格式到日期
【发布时间】:2018-02-19 13:14:01
【问题描述】:

我有以下字符串:20180207T124600Z

我怎样才能把它变成一个 Date 对象?

这是我当前的代码,但它返回 nil:

let dateString = "20180207T124600Z"
let dateFormatter = ISO8601DateFormatter()
dateFormatter.formatOptions = .withFullTime
print(dateFormatter.date(from: dateString))

【问题讨论】:

  • formatOptions 是一个 NSOptionsSet,因此您可以使用数组指定多个选项。如果您查看您可能想要的文档 withFullTimewithFullDate
  • 使用您当前的dateFormatter 选项,执行let date = Date.init() let str = dateFormatter.string(from:date), print("str:\(str)"),您应该会看到formatOption 不正确,请使用@Oliver Atkinson 提供的选项。
  • 该日期不是 ISO-8601 格式。所以不能用ISO8601DateFormatter解析也就不足为奇了

标签: ios swift nsdateformatter iso8601


【解决方案1】:

如果您有如下日期:

let isoDate = "2018-12-26T13:48:05.000Z"

如果您想将其解析为日期,请使用:

let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
isoDateFormatter.formatOptions = [
    .withFullDate,
    .withFullTime,
    .withDashSeparatorInDate,
    .withFractionalSeconds]

if let realDate = isoDateFormatter.date(from: isoDate) {
    print("Got it: \(realDate)")
}

重要的是为您拥有的数据的每个部分提供所有选项。在我的例子中,秒表示为分数。

【讨论】:

    【解决方案2】:

    您可以将 ISO8601 日期格式指定给 NSDateFormatter 以获取日期:

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyyMMdd'T'HHmmssZ"
    print(dateFormatter.date(from: dateString)) //2018-02-07 12:46:00 +0000
    

    【讨论】:

      【解决方案3】:

      您需要指定ISO8601DateFormatter 的格式选项以符合您的要求(年、月、日和时间),下面是一个示例:

      //: Playground - noun: a place where people can play
      
      import UIKit
      
      let dateString = "20180207T124600Z"
      let dateFormatter = ISO8601DateFormatter()
      
      dateFormatter.formatOptions = [
          .withYear,
          .withMonth,
          .withDay,
          .withTime
      ]
      
      print(dateFormatter.string(from: Date()))
      print(dateFormatter.date(from: dateString))
      

      【讨论】:

        【解决方案4】:

        ISO8601DateFormatter 应该类似于

        yyyy-MM-dd'T'HH:mm:ssZ

        只要您的日期字符串格式正确,它就不会返回 nil。

        对于formatOptions,它是根据 Apple 文档生成和解析 ISO 8601 日期表示的选项

        斯威夫特 4

        在你的例子中,它应该是这样的:

        let dateString = "2016-11-01T21:10:56Z"
        let dateFormatter = ISO8601DateFormatter()
        let date = dateFormatter.date(from: dateString)
        
        let dateFormatter2 = ISO8601DateFormatter()
        dateFormatter2.formatOptions = .withFullTime
        print(dateFormatter2.string(from: date!))
        

        【讨论】:

        • 与他输入的字符串“20180207T124600Z”不匹配
        • 是的,如果输入字符串无法更改,那么@sid Mhatre 的答案是最好的解决方案
        • 您可以指定格式选项以匹配他的输入,同时仍使用 ISO8601Formatter stackoverflow.com/a/48867293/1755720
        【解决方案5】:

        您可以使用以下函数来获取日期...

        func isodateFromString(_ isoDate: String) -> Date? {
        
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyyMMdd'T'HHmmssZ"
            return formatter.date(from: isoDate)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-05
          • 1970-01-01
          • 2022-11-23
          • 1970-01-01
          相关资源
          最近更新 更多