swift - DateFormatter:dateFormat 毫秒 Swift

标签 swift dateformatter

我正在编写 DateFormatterdateFormat 将 JSON 从服务器转换为本地 swift 对象。 服务器将返回以下内容。

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

以下是我的代码,但我不确定是否可以只写一行而不是 switch-case 条件(从 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)!
    }

最佳答案

实际上检查日期字符串是否包含句点就足够了

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

或者使用 ISO8601DateFormatter 并使用正则表达式删除毫秒,这也避免了指定 calendarlocaletimezone

let formatter = ISO8601DateFormatter()
let trimmedDateStr = dateStr.replacingOccurrences(of: "\\.\\d+", with: "", options: .regularExpression)
return formatter.date(from: trimmedDateStr)!

关于swift - DateFormatter:dateFormat 毫秒 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52696936/

相关文章:

json - 日期字符串与格式化程序预期的格式不匹配

swift - swift 以大写字母显示 AM/PM

swift - 数组作为参数不适用于 Alamofire

ios - swift ||从 Superview 动画和删除 subview 时的错误

ios - 从同一范围调用 block /闭包

ios - Popover 适用于 iOS 8 但不适用于 iOS 7

swift - 无法更改 CAEmitter SWIFT 的属性

ios - 使用 JSONDecoder 解码古怪的日期格式

Java 8 : DateTimeFormatter not translating timezone based on locale

ios - 如何在 iOS 和 Swift 中使用 DateFormatter 以 09-Nov-2014 格式格式化日期?