【问题标题】:How to handle multiple date formats?如何处理多种日期格式?
【发布时间】:2017-09-13 00:22:25
【问题描述】:

当我到达下面的 df.date() 行时,当使用这种格式 2016-12-27 14:40:46 +0000 的日期时,应用程序会崩溃:

致命错误:在展开可选值时意外发现 nil

我也看到了这个:

错误:执行被中断,原因:EXC_BAD_INSTRUCTION (代码=EXC_I386_INVOP,子代码=0x0)

我有可以采用这种格式的字符串

12/27/2016

但有时是这种格式

2016-12-27 14:40:46 +0000      

这是在上述格式下崩溃的代码sn-p:

let mydate = "12/27/2016" //this works but not the longer format
let df = DateFormatter()
df.dateFormat = "MM/dd/yyyy" //this is the format I want both dates to be in
newDate:Date = df.date(from: mydate)

我如何使用基本上一个函数来处理这两种格式?

【问题讨论】:

  • data(from:) 返回一个可选项,您可以 try 使用第一个格式化程序从字符串中获取 Date,如果返回 nil,请尝试其他格式化程序。最后一行没有编译,我怀疑它会崩溃,没有强制解包
  • 使用两种格式化程序,尝试一种然后另一种。

标签: swift date swift3


【解决方案1】:

检查日期字符串是否包含斜线并相应地设置日期格式:

if mydate.contains("/") {
    df.dateFormat = "MM/dd/yyyy"
}  else {
    df.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
}

【讨论】:

    【解决方案2】:

    您可以尝试一种在代码中非常简洁的方法。你可以添加这个扩展:

    extension DateFormatter {
    
        func dateFromMultipleFormats(fromString dateString: String) -> Date? {
            var formats: [String] = [
            "yyyy-MM-dd hh:mm:ss.SSSSxx",
            "yyyy-MM-dd hh:mm:ss.SSSxxx",
            "yyyy-MM-dd hh:mm:ss.SSxxxx",
            "yyyy-MM-dd hh:mm:ss.Sxxxxx",
            "yyyy-MM-dd hh:mm:ss"
            ]
        for format in formats {
            self.dateFormat = format
            if let date = self.date(from: dateString) {
                    return date
                }
            }
            return nil
        }
    }
    

    然后尝试将函数中的格式数组更改为您可能需要的任何格式。 现在只需像这样使用您的格式化程序:

    if let myDate = dateFormatter.dateFromMultipleFormats(fromString: mydate) {
        print("success!")
    } else {
        print("add another format for \(mydate)")
    }
    

    【讨论】:

      【解决方案3】:

      我认为最好的方法是使用两个 DateFormatter,一个用于 iso8601 格式,另一个用于这种短格式。

      (我下面的代码使用了 DateFormatter 的扩展,但是您可以使用方法/帮助器/这两个格式化程序的任何其他内容)

      斯威夫特 3

      extension DateFormatter {
          static let iso8601DateFormatter: DateFormatter = {
              let formatter = DateFormatter()
              formatter.calendar = Calendar.current // Set the Calendar
              formatter.timeZone = TimeZone(secondsFromGMT: 0) // Set the timezone
              formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
              return formatter
          }()
      
          static let shortDateFormatter: DateFormatter = {
              let formatter = DateFormatter()
              formatter.calendar = Calendar.current // Set the Calendar
              formatter.timeZone = TimeZone(secondsFromGMT: 0) // Set the timezone
              formatter.dateFormat = "MM/dd/yyyy"
              return formatter
          }()
      
          static func date(string: String) -> Date? {
              if let iso8601Date = iso8601DateFormatter.date(from: string) {
                  return iso8601Date
              } else if let shortDate = shortDateFormatter.date(from: string) {
                  return shortDate
              } else {
                  return nil
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-09
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多