Это yyyy-MM-dd'T'HH:mm:ss
.Ваши строки имеют секунды (поэтому включают :ss
), но не имеют ни миллисекунд (т. Е. Не включают .SSS
), ни квалификатора часового пояса (т. Е. Также не включают Z
).
Интересный вопросдля меня это то, что часовой пояс должен предполагать.По умолчанию, при отсутствии части часового пояса в строке, DateFormatter
будет предполагать местный часовой пояс, даже если есть большая вероятность, что это GMT / UTC / Zulu.Если это так, явно установите timeZone
форматера.И, конечно же, не забудьте установить locale
.
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0) // include this only if dates are GMT/UTC/Zulu
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
Кстати, вы можете, если хотите, также использовать ISO8601DateFormatter
, что предполагает UTC / GMT,если вы хотите:
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withFullDate, .withTime, .withColonSeparatorInTime]
И, в этом случае, если вы хотите использовать местный часовой пояс, вам нужно будет указать его:
formatter.timeZone = .current
К сожалению, с помощью dateDecodingStrategy
и не может использовать ISO8601DateFormatter
.Аналогично, стратегия .iso8601
предполагает, что у вас будет персонаж часового пояса.
Итак, с Codable
и вашими конкретными строками вы должны придерживаться DateFormatter
примера выше.