This is what I'm trying to decode:
{"MessageDate":"2017-11-28T05:04:40.9611765"}
I've omitted the rest of the JSON structure.
How do I have JSONDecoder
parse that date format into a Date
object?
This is what I've tried so far:
extension Formatter
{
static let dotNetDateTime: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
return formatter
}()
/// https://stackoverflow.com/a/46458771/8462094
static let dotNetDateTimeISO8601: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
return formatter
}()
/// https://stackoverflow.com/a/46458771/8462094
static let dotNetDateTimeISO8601NoMS: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
return formatter
}()
static let dotNetDateTimeCustom: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS"
return formatter
}()
static let iso8601Full: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
}
Some of those have been taken from other Stack Overflow posts.
I've also attempted a lot of other date decoding strategies not listed above.
I've scoured the internet for hours for solutions.
I've looked at the Unicode documentation for date format patterns.
I've enlisted the help of another friend, and he doesn't know either.
I suspect the seven digit float at the end of the date string is the culprit, but I don't know how to tackle that.
Maybe I'm just missing something really small. Another set of eyes would be nice.
Any help is greatly appreciated guys, thanx.
I guess I should include the actual code where I'm parsing:
let attempt1 = JSONDecoder()
attempt1.dateDecodingStrategy = .formatted(Formatter.dotNetDateTime)
let attempt2 = JSONDecoder()
attempt2.dateDecodingStrategy = .formatted(Formatter.dotNetDateTimeISO8601)
//And more attempt initializations
...
print(String(data: data, encoding: .utf8)!)
if let deser = try? attempt1.decode(MessageThreads.self, from: data)
{
return onDone(deser, nil)
}
if let deser = try? attempt2.decode(MessageThreads.self, from: data)
{
return onDone(deser, nil)
}
//And more attempts
...