Поведение по умолчанию сериализатора Джексона, используемого в среде Spring, выглядит следующим образом: (из исходного кода spring-data-rest):
/**
* The most common ISO DateTime Format {@code yyyy-MM-dd'T'HH:mm:ss.SSSZ},
* e.g. "2000-10-31T01:30:00.000-05:00".
* <p>This is the default if no annotation value is specified.
*/
Таким образом, одним из примеров такого форматирования может быть 2019-03-20T11:18:46.000+0000
. Swift также имеет декодер ISO8601, но фактически для Swift эта строка имеет только недопустимый формат из-за миллисекунд. Если вы удалите часть в миллисекундах, swift может успешно десериализовать строку.
struct Test: Codable {
let createdAt: Date
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let data2 = "{\"createdAt\": \"2018-12-05T14:05:35.000+0000\"}".data(using: .utf8)!
let decoded2 = try! decoder.decode(Test.self, from: data2)
Swift относится к RFC 3339 https://www.ietf.org/rfc/rfc3339.txt, и здесь нет упоминаний о миллисекундах. У меня вопрос - какой формат тогда правильный? Если что-то в формате ISO, которое должно быть строго определено, я обычно не ожидаю написать собственный десериализатор (swift) или определить пользовательский шаблон для сериализации (spring).