2017-06-29 86 views
0

在我们的iphone应用程序中,我们解析了api调用得到的日期。日期正确返回并且是有效的日期。现在只有在某些设备上,它会在意外发现零的错误时崩溃,同时展开可选值。这里是有问题的代码:iPhone日期格式化程序随机崩溃

//formatDate(date: date, format: FullDateFormat) 
class func formatDate(date: String, format: String)->String{ 
    if date.characters.count == 0 {return "" } 
    let formatter = DateFormatter() 
    formatter.dateFormat = Constants.FullDateFormat 
    let nsDate = formatter.date(from: date) 

    formatter.dateFormat = format 
    return formatter.string(from: nsDate!) 
} 

nsDate没有被格式化,因为它是零。

的Constants.FullDateFormat是定义为“M/d/yyyy的H:mm:ss的一个”静态字符串作为日期将总是以这种格式

到类函数的调用将会看起来像这样

let newDate = Helpers.formatDate(date: "9/27/2017 9:26:51 AM", format: "h:mm a") 

一些设备崩溃,而大多数设备崩溃。如果我们不使用类功能,则应用程序可以正常工作。我没有看到任何原因,所以如果有人看到为什么会发生这种情况和可能的解决方案,请让我知道。

这可能是重复的,但并未显示在我执行的任何搜索中。感谢社区,他们指出了另外一个类似的问题,其答案已经在stackoverflow。如果这是重复的,我很抱歉。

+0

不应使用强迫的展开'nsDate',你应该把它放在警戒声明中。大多数情况下,在你的应用程序崩溃的设备上,其他一些设置(例如语言环境)是不同的,这些会导致解析日期问题,因为你没有指定'DateFormatter'使用的相当多的信息 –

+0

Thanks Martin R我在搜索时没有看到这种情况。我不介意删除它,但它可以帮助其他人。我会通过编辑并指出您发布的问题。 –

+0

解决方案与“Martin R”的建议相同,但我理解Micah的困惑。 – kulss

回答

2

这是一个地区的问题。 DateFormatter取决于设备的当前位置设置,包括日期和时间。

可以确保格式化的语言环境始终是静态通过其区域设置为en_US_POSIX

formatter.locale = Locale(identifier: "en_US_POSIX") 

看到苹果的链接了解详情:

https://developer.apple.com/documentation/foundation/nsdateformatter

+1

这是修复。感谢大家。 –