Каков правильный формат для этой даты и времени? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь использовать codable для декодирования ответа json в модель, но у меня возникают проблемы с анализом даты.

Формат, который я использую в DateFormatter, равен "yyyy-MM-dd'T'HH:mmZ" и образецданные

{
    "startDate": "2019-01-27T00:00:00",
    "endDate": "2019-02-02T00:00:00",
    "id": null
}, {
    "startDate": "2019-01-20T00:00:00",
    "endDate": "2019-01-26T00:00:00",
    "id": null
}, {
    "startDate": "2019-01-13T00:00:00",
    "endDate": "2019-01-19T00:00:00",
    "id": null
}, {
    "startDate": "2019-01-13T00:00:00",
    "endDate": "2020-01-19T00:00:00",
    "id": null
}, {
    "startDate": "2019-01-06T00:00:00",
    "endDate": "2019-01-12T00:00:00",
    "id": null
}

Я также пытался "yyyy-MM-dd'T'HH:mmZ", "yyyy-MM-dd'T'HH:mm:ssZ" и "yyyy-MM-dd'T'HH:mm:ss.SSSZ" с ' и без * вокруг 1011 *

, ошибка, которую я получаю,

"NSCodingPath": [CodingKeys (stringValue: "result", intValue: nil), _JSONKey (stringValue: "Index 0", intValue: 0), CodingKeys (stringValue: "startDate", intValue: nil)], "NSDebugDescription": "Строка даты не соответствует формату, ожидаемому форматером."

Я уверен, что я правильно понял формат, но эта ошибка заставляет меня усомниться в здравом уме.

Я получил форматы от https://nsdateformatter.com/

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Это 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 примера выше.

0 голосов
/ 05 февраля 2019

Указатель формата Z не нужен, поскольку строки даты не включают смещение часового пояса.

...