DateFormatter: dateFormat миллисекунды Swift - PullRequest
0 голосов
/ 08 октября 2018

Я пишу DateFormatter dateFormat для преобразования JSON с сервера в локальный объект swift.Сервер вернет следующее.

  • 2018-10-07T15: 26: 33.236Z
  • 2018-10-07T15: 26: 33Z
  • 2018-10-07T15: 26: 33.26Z

Ниже приведен мой код, но я не уверен, что могу написать только одну строку вместо условий переключения (от SWITCH-CASE START до END).

Идеально подходит только один dateFormat, независимо от того, имеет ли возвращаемое время миллисекунды или нет.Любой совет приветствуется.

    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .custom{
        let container = try $0.singleValueContainer()
        let dateStr = try container.decode(String.self)
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .gregorian)
        formatter.locale = .current
        // *** SWITCH-CASE: START ***
        switch dateStr.utf8.count {
        case 20:
                    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
        case 22:
                    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
        case 23:
                    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSZ"
        case 24:
                    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        default:
                    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        }
        // *** SWITCH-CASE: END ***
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        return formatter.date(from: dateStr)!
    }

1 Ответ

0 голосов
/ 08 октября 2018

На самом деле достаточно проверить, содержит ли строка даты период

if dateStr.contains(".") {
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
} else {
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
}

В качестве альтернативы используйте ISO8601DateFormatter и удалите миллисекунды с регулярным выражением, при этом также не нужно указывать calendar, locale иtimezone

let formatter = ISO8601DateFormatter()
let trimmedDateStr = dateStr.replacingOccurrences(of: "\\.\\d+", with: "", options: .regularExpression)
return formatter.date(from: trimmedDateStr)!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...