无法解析的实际设备的日期,工作在模拟器

问题描述:

我有一个应用程序,如果我尝试运行在真实设备上这个应用程序(iPhone 5S和6) - Xcode中显示错误:无法解析的实际设备的日期,工作在模拟器

fatal error: unexpectedly found nil while unwrapping an Optional value 2017-04-11 00:43:58.724143+0200 APN[2153:475883] fatal error: unexpectedly found nil while unwrapping an Optional value

有一块代码在哪里是问题。但在模拟器中一切正常。

let stringBefore = "Mon, 10 Apr 2017 11:39:24 +0000" 

let startIndexDate = stringBefore.index(stringBefore.startIndex, offsetBy: 5) 
let endIndexDate = stringBefore.index(stringBefore.endIndex, offsetBy: -15) 

let rangeDate = startIndexDate..<endIndexDate 
let stringAfter = stringBefore.substring(with: rangeDate) 

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "dd MMM yyyy" 

let date = dateFormatter.date(from: stringAfter) 
dateFormatter.dateFormat = "dd.MM.yyyy" 

let finish = dateFormatter.string(from: date!) // there is the problem but why in Simulator is ok? 

我知道我可以写

dateFormat = "EEE, dd MMM yyyy hh:mm:ss +zzzz" 

,但我想问你问题出在哪里?

+0

打印'stringAfter'的值并查看它的值。它不能匹配'dd MMM yyyy'。 – rmaddy

+0

由于您使用英文星期和月份名称的固定格式,并且希望避免讨厌的12/24小时格式问题,所以您需要将格式化程序的区域设置设置为'en_US_POSIX'。 – rmaddy

+0

谢谢,它的工作! – spread7

这可能是您的转换器无法处理的奇怪时区问题。我不知道没有一些调试。

无论如何,我会建议使用另一个DateFormatter找到你的日期,而不是试图解析字符串:

let startingFormatter = DateFormatter() 
startingFormatter.dateFormat = "EEE, dd MMM y HH:mm:ss Z" 

let endingFormatter = DateFormatter() 
endingFormatter.dateFormat = "dd.MM.yyyy" 

let stringBefore = "Mon, 10 Apr 2017 11:39:24 +0000" 
let actualDate = startingFormatter.date(from: stringBefore) 

if let actualDate = actualDate { 
    let finish = endingFormatter.string(from: actualDate) //result is "10.04.2017" 
} 
else { 
    //handle error 
} 

此外,作为一般规则,力展开可选(date!)是一个坏主意,除非你100%有信心有一个价值,(你不能在这种情况下,因为你不知道底下发生了什么),或者如果该值不存在,你的程序崩溃就可以。

+0

在第一个格式化程序中,您需要'HH',而不是'hh'。为什么有'actualDate'然后'如果let'?合并成一个:'如果让actualDate = startingFormatter ...'。 – rmaddy

+0

什么?一些错误的字符串输入?我想这是第一次0 :-)/s我打破了它,以更好地显示发生了什么。如果这是我自己的产品代码,我会做一些不同的事情。 – PeejWeej