从 Date 转换为 NSDate 时崩溃
Crashing when casting from Date to NSDate
我在寻找获取当前时间的简单方法时发现了这个过时的问题 (-> 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)
我不知道如何摆脱这个错误,非常感谢任何帮助!
根据您的说法,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 但对您有帮助):
此外,一旦看到这个documents/links:
- NSDateFormtter 处理字符串日期的格式。
- 这是 Apple 的文档:Date Formatters
- 这是日期格式列表:Date Formats
编辑:
您的日期格式很好并且可以正常工作。
经过多次尝试。我找到了解决方案。
只需添加这行代码:
let Formatter = DateFormatter()
Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
Formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
尽情享受吧!
我在寻找获取当前时间的简单方法时发现了这个过时的问题 (-> 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)
我不知道如何摆脱这个错误,非常感谢任何帮助!
根据您的说法,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 但对您有帮助):
此外,一旦看到这个documents/links:
- NSDateFormtter 处理字符串日期的格式。
- 这是 Apple 的文档:Date Formatters
- 这是日期格式列表:Date Formats
编辑: 您的日期格式很好并且可以正常工作。
经过多次尝试。我找到了解决方案。 只需添加这行代码:
let Formatter = DateFormatter()
Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
Formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
尽情享受吧!