2017-05-25 55 views
0

我正在使用以下函数从String创建Date。它在模拟器上运行良好。但它在真正的iPhone上坠毁。为什么从字符串创建日期只有失败在真正的iPhone?

String: "Tue May 23 23:19:41 +0800 2017" 

第一张照片是真正的iPhone上的调试信息。第二个是在模拟器上调试信息。 Debugging information on real iPhone

Debugging infomation on simulator

func createDate(fromString string: String) -> Date { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy" 
     let date = formatter.date(from: string) //fatal error: unexpectedly found nil while unwrapping an Optional value 

     return date! 
} 

我甚至尝试了操场。这真的很奇怪! 谢谢!

+2

检查语言与地区(在设置→常规)设置为所述装置和仿真器上是相同的。可能您需要将'Locale'对象传递给您的日期格式化程序以具有类似的行为 – dymv

+1

'DateFormatter'认为当前的区域设置。模拟器的默认语言环境是'en_US'。特定设备可能具有不同的区域设置。 – vadian

+0

我在过去遇到同样的问题,我不确定问题的原因。但如果需要,我可以指导您解决方案。到目前为止,我在objective-c中有它的解决方案。 –

回答

1

link可以解决你的问题.....

斯威夫特

formatter.locale = Locale(identifier: "en_US") 
+0

这完全解决了我的问题。谢谢! – JsW

+0

@CallOfOrange很高兴听到这个消息,你能请标记为答案 –

0

您日期格式稍有不妥,请用波纹管例如日期格式。

let dateString : String = "Tue May 23 23:19:41 +0800 2017" 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss ZZZ yyyy" 
dateFormatter.timeZone = TimeZone(identifier: "GMT") 
print(dateFormatter.date(from: dateString)) 
+0

谢谢,队友:) – JsW

1

我敢打赌,它在下一行崩溃,而不是你已评论的行。你在强制解开结果。如果日期转换失败,那么这个force-unwrap将会崩溃,并报告您报告的确切错误。

我打电话给!运算符“crash if nil”operator。你不应该那样做。您需要防守编程并返回可选项,然后编写调用代码以处理转换失败的情况。

其他人已经指出日期格式化程序取决于设备的区域设置,如果不同,则转换可能会失败。如果您想给格式化程序的区域设置一个已知区域设置,那么格式化程序的格式不会因国家和语言而异。

+0

是的,我犯了一个错误。它在'!'运算符上崩溃,并设置'locale'属性确实解决了我的问题。我非常感谢你的建议,我应该让这个计划更加强大。谢谢! – JsW

1

从应用程序文档

当固定格式的日期,如RFC 3339的工作,你设置 DateFormat属性指定格式字符串。对于大多数固定的 格式,您还应该将locale属性设置为POSIX语言环境 (“en_US_POSIX”),并将timeZone属性设置为UTC。

RFC 3339

在MacOS上10.12及更高版本的iOS或10及更高版本,与ISO 8601日期 表示工作时使用 ISO8601DateFormatter类。

wiki ISO 8601

为了正确格式,使用Date Field Symbol Table

+0

谢谢!将'Locale'属性设置为''“en_US”'后,'String'成功转到'Date'。你帮了我很多。 – JsW

+0

@CallOfOrange formatter.dateFormat =“EEE MMM dd HH:mm:ss xxxx yyyy”; formatter.locale = Locale(identifier:“en_US_POSIX”); formatter.timeZone = TimeZone(简称:“UTC”); – user3441734

+0

'“zzz/ZZZ”'也适用。根据[www.unicode.org](http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Field_Symbol_Table)''+0000“(”Z “,”xx“,”xxxx“),”Z xx xxxx“具有相同的含义。 – JsW

相关问题