从 Date 转换为 NSDate 时崩溃

Posted

技术标签:

【中文标题】从 Date 转换为 NSDate 时崩溃【英文标题】:Crashing when casting from Date to NSDate 【发布时间】:2018-07-03 15:56:27 【问题描述】:

我在寻找获取当前时间的简单方法时发现了这个过时的问题 (-> Swift get server time)。

我已将代码从 (-> Answer) 更新到当前的 Swift 版本,现在看起来像这样:

func serverTimeReturn(completionHandler:@escaping (_ getResDate: NSDate?) -> Void) 
    let url = NSURL(string: "http://www.google.com")
    let task = URLSession.shared.dataTask(with: url! as URL) (data, response, error) in
        let httpResponse = response as? HTTPURLResponse
        if let contentType = httpResponse!.allHeaderFields["Date"] as? String 
            let dFormatter = DateFormatter()
            dFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
            var serverTime = dFormatter.date(from: contentType)
            completionHandler(serverTime as! NSDate)
        
     
    task.resume()


...调用...

serverTimeReturn  (getResDate) -> Void in
            var dFormatter = DateFormatter()
            dFormatter.dateStyle = DateFormatter.Style.long
            dFormatter.timeStyle = DateFormatter.Style.long
            dFormatter.timeZone = NSTimeZone(abbreviation: "GMT") as! TimeZone
            var dateGet = dFormatter.string(from: getResDate as! Date)

            print("Formatted Time : \(dateGet)")

但我仍然收到此错误消息:

Fatal error: Unexpectedly found nil while unwrapping an Optional value

--> Thread 3: EXC_BREAKPOINT (code=1, subcode=xyz) 同时调用completionHandler(serverTime as! NSDate)


我不知道如何摆脱这个错误,非常感谢任何帮助!

【问题讨论】:

"致命错误:在展开可选值时意外发现 nil" 这意味着某些东西是 nil。试着找出哪一个。您使用各种 ! 大喊:“如果值为 nil,则崩溃”。 我很确定 serverTime 必须为零,这也是崩溃的原因! 你应该使用 https。请注意,在 Swift 3 或更高版本中,您应该从 NSDate、NSTimeZone 和 NSURL 中删除 NS 前缀 我没有运行你的代码,但是如果serverTime 为nil,而你运行serverTime as! NSDate,那会导致崩溃。你的 dateFormatter 错了吗?你介意打印contentType 吗? 【参考方案1】:

根据您的说法,serverTime as! NSDate 是致命错误的原因:因此您可能无法以您设置的日期格式(“EEE,dd MMM yyyy HH:mm:ss z”)获取字符串日期contentType

设置日期格式器的日期格式,与您的contentType日期匹配。

contentType 的结果是什么?

试试这个,让我知道日期字符串

if let contentType = httpResponse!.allHeaderFields["Date"] as? String 

        print("contentType - \(contentType)") // What is result of contentType here?
        let dFormatter = DateFormatter()
        dFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
         // Update here - Use If-let block for NSDate casting and remove "as! NSDate" from completionHandler
        if let serverTime = dFormatter.date(from: contentType) as? NSDate 
           completionHandler(serverTime)
        

以下答案可能对您有所帮助,如何处理和使用日期格式化程序(它在 Objective-c 中,但对您有帮助):

Check date format in Objective-c

另外,请查看此文档/链接:

NSDateFormtter 处理字符串日期格式。 这是 Apple 的文档:Date Formatters 这里是日期格式列表:Date Formats

编辑: 您的日期格式很好并且可以正常工作。

【讨论】:

这是使用您的代码打印出来的结果:contentType - Wed, 24 Jan 2018 14:58:59 GMT - 所以我的日期格式化程序一定是错误的。 好的,给我一些时间,会给你确切的解决方案。 提前感谢您的帮助 Krunal! 使用区域设置 "en_US_POSIX" 并将其设置为您的 dateFormatter? @Jonas0000 分享completionHandler 的完整代码。您在其中处理任何其他操作吗?【参考方案2】:

经过多次尝试。我找到了解决方案。 只需添加这行代码:

let Formatter = DateFormatter()
Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
Formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"

享受吧!

【讨论】:

以上是关于从 Date 转换为 NSDate 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSDate 因连续操作而崩溃

将NSString转换为NSDate时,月份会发生变化

转换为使用 iOS 8 Popover Segues 时 UISplitViewController 崩溃

ios中从字符串到NSDate的日期转换

Swift:从接口类型数组转换为对象数组崩溃

NSJSONSerialization 崩溃的应用程序