日期格式化程序在swift中崩溃

时间:2017-07-31 01:38:26

标签: swift nsdateformatter date-formatting

请帮我修改这段代码,

if let dateVaule = UserDefaults().value(forKey: SplashSeenDate){
            let dateStr  = dateVaule as! String
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
            dateFormatter.timeZone = TimeZone.ReferenceType.local
            let date = dateFormatter.date(from:dateStr)
            if Global.sharedInstance.Splashs != nil && Global.sharedInstance.Splashs?.count != 0{

                for (i,splash) in (Global.sharedInstance.Splashs?.enumerated().reversed())!{
                    if !checkTimeStamp(date: splash.create_timestamp,StoredDate: date!){
                        Global.sharedInstance.Splashs?.remove(at: i)
                    }
                }
                print(Global.sharedInstance.Splashs?.count ?? "-1")
            }
        }

老实说,我对日期格式化程序非常困惑。 当这个项目启动时,它在

发生了崩溃
if !checkTimeStamp(date: splash.create_timestamp,StoredDate: date!){

然而,我无法复制此崩溃... **只有少数iOS10用户发生了这次崩溃。**请提出建议,非常感谢!

func checkTimeStamp(date: String!,StoredDate: Date) -> Bool {
    let dateFormatter: DateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    dateFormatter.locale = Locale(identifier:"en_US_POSIX")
    let datecomponents = dateFormatter.date(from: date)

    if (datecomponents! >= StoredDate) {
        return true
    } else {
        return false
    }
}

2 个答案:

答案 0 :(得分:5)

您正在以两种不同的方式将String转换为Date

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone.ReferenceType.local //###Why don't you use `TimeZone.current`?
let date = dateFormatter.date(from:dateStr)

checkTimeStamp(date: String!,StoredDate: Date) -> Bool

let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier:"en_US_POSIX")
let datecomponents = dateFormatter.date(from: date)

在您的情况下,第一次转换缺少此行

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

您可以找到许多文章,讨论返回DateFormatter的{​​{1}}(或旧文章中的NSDateFormatter)。

当您使用nil等固定格式的DateFormatter时,必须将"yyyy-MM-dd HH:mm:ss"设置为locale

也许您最好定义一种转换方法(或计算属性),以便将Locale(identifier: "en_US_POSIX")转换为适合您应用的要求的String,并在您需要的任何地方使用{ {1}}转换为Date

String

通常,您的代码使用过多的强制解包或强制转换。您可以在不使用任何强制性内容的情况下重新编写它:

Date

(假设extension String { var toAppDate: Date? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" dateFormatter.timeZone = TimeZone.current dateFormatter.locale = Locale(identifier: "en_US_POSIX") //### <- Do not miss. return dateFormatter.date(from: self) } } 不是可选的,并将参数标签 if let dateStr = UserDefaults().string(forKey: SplashSeenDate), let date = dateStr.toAppDate, let splashes = Global.sharedInstance.Splashs, !splashes.isEmpty { //### In most cases, `filter` is faster than repeated `remove`. Global.sharedInstance.Splashs = splashes.filter { checkTimeStamp(date: $0.create_timestamp, storedDate: date) } print(Global.sharedInstance.Splashs?.count ?? "-1") } 重命名为create_timestamp。)

答案 1 :(得分:0)

似乎splash.create_timestamp正在变为nil,当您传递此函数checkTimeStamp时。它正在崩溃。您可以通过将checkTimeStamp函数中的date参数更改为可选来防止崩溃,并在传递函数之前使用guard语句。