当输入的日期是swift中月份的最后一天时,NSDateFormatter导致崩溃

时间:2016-02-28 06:41:34

标签: ios swift nsdate nsdateformatter

我遇到这个奇怪的问题从字符串中获取NSDate,如果输入的日期是该月的最后一天(例如:2016-3-31),则应用程序崩溃时“意外发现nil,同时展开一个可选项值。”这是我用来实现的NSDate扩展:

extension NSDate {
convenience
init(dateString:String) {
    let dateStringFormatter = NSDateFormatter()
    dateStringFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")


            let d = dateStringFormatter.dateFromString(dateString)!
            self.init(timeInterval:0, sinceDate:d)
    }
}

它崩溃了:

let d = dateStringFormatter.dateFromString(dateString)!

我认为这意味着它无法将字符串转换为NSDate。但是,只有当日期是该月的最后一天时才会发生。如果我改变输入的字符串,例如,从“2016-3-31 02:00:00”改为“2016-3-30 02:00:00”它运行得很好。如果有人能帮助我解决这个问题,我们将不胜感激。

编辑:此代码工作正常。问题最终出现在我用于计算输入字符串的代码中,该代码在当天增加了1。我还将此更改为“if let”语句,以避免因类似疏忽导致的未来崩溃。因为它可能对其他人有用,这里是我用过的代码:

    if let d = dateStringFormatter.dateFromString(dateString)  {
    self.init(timeInterval:0, sinceDate:d)
    } else {
        let d = dateStringFormatter.dateFromString("2017-12-15 00:00:00")
        self.init(timeInterval:0, sinceDate:d!)
    }

1 个答案:

答案 0 :(得分:1)

嗯 - 运行你的代码,两者都在Playground中提供完美的字符串。

您可能会检查的一件事是,您的字符串格式不会在其他地方出现错误,因为此代码看起来不错,错误表明它无法生成d