代码之家  ›  专栏  ›  技术社区  ›  simotunes

DateFormatter:日期格式

  •  0
  • simotunes  · 技术社区  · 6 年前

    我在写 DateFormatter dateFormat 将JSON从服务器转换为本地swift对象。

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

    下面是我的代码,但我不确定是否可以只写一行而不是switch-case条件(从switch-case开始到结束)。

    无论返回的时间是否为毫秒,都是理想的。

        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 回复  |  直到 6 年前
        1
  •  4
  •   vadian    6 年前

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

    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)!