您不能让日期格式化程序抛出错误,但如果需要,您可以从此方法抛出错误,例如
enum DateConversionError: Error {
case unableToParseString
}
func dateFromString(stringDateTimeParameter: String) throws -> Date {
let formatter = DateFormatter()
formatter.dateFormat = "MMddyyyyHHmmssSSS"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0) // or omit to use your current time zone
guard let date = formatter.date(from: stringDateTimeParameter) else {
throw DateConversionError.unableToParseString
}
return date
}
然后您可以执行以下操作:
do {
let date = try dateFromString(stringDateTimeParameter: "23282019111259318")
print(date)
} catch {
print(error)
}
话虽如此,感觉就像我们在扭曲自己以抛出错误。使用选项更简单:
func dateFromString(stringDateTimeParameter: String) -> Date? {
let formatter = DateFormatter()
formatter.dateFormat = "MMddyyyyHHmmssSSS"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0) // or omit to use your current time zone
return formatter.date(from: stringDateTimeParameter)
}
guard let date = dateFromString(stringDateTimeParameter: "23282019111259318") else {
print("unable to parse date")
return
}
// use `date` here
如果您正在解析 Web API 响应,那么该响应是 JSON 格式的,我倾向于使用JSONDecoder并指定以下格式器dateDecodingStrategy:
let decoder = JSONDecoder()
let formatter = DateFormatter()
formatter.dateFormat = "MMddyyyyHHmmssSSS"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
decoder.dateDecodingStrategy = .formatted(formatter)
// use `decoder` to parse your JSON and it will handle conversions/errors for you
这引出了一个问题,为什么您使用这种MMddyyyyHHmmssSSS格式,而不是标准格式,例如yyyy-MM-dd'T'HH:mm:ss.SSSX,但这是一个单独的问题。
最后,创建日期格式化程序是一个昂贵的过程。您真的不希望将其隐藏在您的dateFromString方法中,您可能会多次调用该方法。实例化一次格式化程序,然后让您的dateFromString方法使用已经创建的格式化程序。