字符串扩展 toDate() 使某些设备崩溃

String extensions toDate() is crash some device

我的问题是尝试将字符串转换为日期,crash.My 应用程序在 App Store 上,运行 在我的设备上,但它在某些设备上崩溃 devices.I 查看崩溃日志并查看当字符串 date.I 不明白为什么我的设备工作正常或某些设备工作正常但其他设备崩溃时,它会崩溃。

func toDate() -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+03:00" //Your date format
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") //Current time zone
    //according to date format your date string
    guard let date = dateFormatter.date(from: self) else {
        fatalError()
    }
    return date
}

两种解决方案:

  1. 为固定格式添加 en_US_POSIX 语言环境。
  2. 使用ISO8601DateFormatter(iOS 8+),好处是无语言环境,无日期格式,无时区。

    func toDate() -> Date? {
        let dateFormatter = ISO8601DateFormatter()
        return dateFormatter.date(from: self) 
    }
    

无论如何return一个可选的,fatalError()在生产环境中会导致非常糟糕的用户体验。

你会崩溃,因为任何时候你试图在一个不是定义字符串格式中的日期的字符串上执行这个方法时,dateFormatter 将 return nil,然后你的 guard 语句将调用 fatalerror ()

只是 return 日期格式化程序的输出并在调用站点处理可选的。

func toDate() -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+03:00" 
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") 
    return dateFormatter.date(from: self) 
}

您可能还想考虑只使用默认的当前语言环境时区而不是指定时区?