DateFormatter dateFromString始终在swift 3中返回nil

时间:2017-07-24 13:51:40

标签: ios swift nsdate

由于某种原因无法将字符串转换为NSDate。

这是我的日期转换代码:

 let kSQLiteDateFormat : String = "yyyy/MM/dd HH:mm:ss Z"
let dateFormat = [kSQLiteDateFormat,
"dd MM, yyyy",
"MMM-yyyy",
"yyyy-MM-dd",
"yyyy-12",
"yyyy/MM/dd",
"yyyy/mm/dd",
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd HH:mm:ss Z",
"yyyy-MM-dd HH:mm:ss K",
"yyyy-MM-dd HH:mm:ss ZZ",
"yyyy/MM/dd hh:mm a",
"MM/dd/yyyy",
"MM/dd/yyyy HH:mm:ss Z",
"h:mm a",
"hh:mm a",
"yyyy/MM/dd HH:mm:ss Z",
"yyyy/MM/dd h:mm a",
"MM/dd/yyyy h:mm a",
"yyyy-MM-dd h:mm a",
"yyyy-MM-dd'T'hh:mm:ss",
"yyyy/MM/dd h a",
"yyyy-MM-dd'T'HH:mm:ss","dd MMM, yyyy","dd-MM-yyyy HH:mm", "EEE, MMM dd","MM/dd/yyyy hh:mm:ss a"]


if let dateString : String = dateString as String? {
        let dateFormatter : DateFormatter = DateFormatter()
        for format in dateFormat {

            dateFormatter.dateFormat =  format
            if  let date : NSDate = (dateFormatter.date(from: dateString)! as NSDate) {
                return date
            }
        }
    }
    return nil

每次返回nil

3 个答案:

答案 0 :(得分:3)

强制展开

if  let date : NSDate = (dateFormatter.date(from: dateString)! as NSDate) {
    return date
}
如果dateString与日期格式不匹配,并且dateFormatter.date(from: dateString)返回nil

会导致程序崩溃。

你可能想要的是

if let date = dateFormatter.date(from: dateString) {
    return date
}

或者,如果您确实需要NSDate而不是Date

if let date = dateFormatter.date(from: dateString) {
    return date as NSDate
}

此外,您可能希望将格式化程序设置为" POSIX"

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

为了避免依赖用户的区域偏好, 比较DateFormatter doesn't return date for "HH:mm:ss"

答案 1 :(得分:1)

我发现,如果您选择使用“ MM / dd / yyyy hh:mm:ss”之类的格式,而不是“ MM / dd / yyyy HH:mm:ss”,则如果小时数大于12,您将得到零。请注意hh和HH的区别。

所以这种格式“ MM / dd / yyyy HH:mm:ss”应该可以。

答案 2 :(得分:0)

从您的代码中,它只能在此行返回nil

return nil

并且意味着此检查返回false

if let dateString : String = dateString as String?

检查您的dateString变量,可能是零。