DateFormatter dateFromString 总是 Returns nil in swift 3
DateFormatter dateFromString Always Returns nil in swift 3
由于某些原因无法将字符串转换为 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
每次return无
根据你的代码,它只能在这一行return nil
return nil
这意味着这个检查 returns false
if let dateString : String = dateString as String?
检查你的 dateString
变量可能是 nil。
中的强制展开
if let date : NSDate = (dateFormatter.date(from: dateString)! as NSDate) {
return date
}
如果dateString
不匹配日期格式和dateFormatter.date(from: dateString)
returnsnil
会使程序崩溃。
你可能想要的是
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")
为了避免依赖于用户的区域偏好,
比较 .
我发现如果你选择使用像 "MM/dd/yyyy hh:mm:ss" 这样的格式而不是 "MM/dd/yyyy HH:mm:ss",如果你的小时大于 12,你将得到 nil。请注意 hh 和 HH 的区别。
所以这种格式 "MM/dd/yyyy HH:mm:ss" 应该有效。
由于某些原因无法将字符串转换为 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
每次return无
根据你的代码,它只能在这一行return nil
return nil
这意味着这个检查 returns false
if let dateString : String = dateString as String?
检查你的 dateString
变量可能是 nil。
if let date : NSDate = (dateFormatter.date(from: dateString)! as NSDate) {
return date
}
如果dateString
不匹配日期格式和dateFormatter.date(from: dateString)
returnsnil
会使程序崩溃。
你可能想要的是
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")
为了避免依赖于用户的区域偏好,
比较
我发现如果你选择使用像 "MM/dd/yyyy hh:mm:ss" 这样的格式而不是 "MM/dd/yyyy HH:mm:ss",如果你的小时大于 12,你将得到 nil。请注意 hh 和 HH 的区别。
所以这种格式 "MM/dd/yyyy HH:mm:ss" 应该有效。