Swift中如何在JSON请求body内添加Date类型数据
Swift POST请求添加Date类型参数的方案
方案1:Date转字符串后存入原有[String: String]字典
适合参数少、不想改现有结构的场景,提前和服务端对齐日期格式即可,最常用的是ISO8601标准格式或时间戳:
// 全局复用ISO8601格式化器,避免重复创建损耗性能 let isoDateFormatter = ISO8601DateFormatter() // 可根据服务端要求调整格式选项,比如要不要带毫秒、时区等 isoDateFormatter.formatOptions = [.withInternetDateTime] // 转成字符串后加入原有字典 let currentDateStr = isoDateFormatter.string(from: Date()) let body: [String: String] = [ "device": device, "version": version, "model": model, "problem": userInput, "createTime": currentDateStr // 新增Date转成的字符串字段 ]
如果服务端要求传数字类型的时间戳,写法如下:
// 秒级时间戳,需要毫秒的话乘1000即可 let timestamp = Int(Date().timeIntervalSince1970) // 注意字典类型要改成[String: Any]兼容数字类型 let body: [String: Any] = [ "device": device, "version": version, "model": model, "problem": userInput, "createTime": timestamp ]
方案2:使用Codable模型构造请求体(更推荐)
参数多、类型复杂的场景优先用这个方案,不用手动处理类型转换,编译器会帮你做类型校验:
- 先定义请求体模型,直接声明Date类型属性
struct FeedbackRequest: Codable { let device: String let version: String let model: String let problem: String let createTime: Date // 直接写Date类型即可 }
- 初始化模型后用JSONEncoder编码成请求体
// 初始化模型 let requestBody = FeedbackRequest( device: device, version: version, model: model, problem: userInput, createTime: Date() ) // 编码为JSON数据 let encoder = JSONEncoder() // 配置日期编码策略,和服务端要求对齐 encoder.dateEncodingStrategy = .iso8601 // 要时间戳的话改成下面这行 // encoder.dateEncodingStrategy = .secondsSince1970 guard let httpBody = try? encoder.encode(requestBody) else { // 编码失败处理逻辑 return } // 赋值给URLRequest即可发起请求 var request = URLRequest(url: 你的服务端接口地址) request.httpMethod = "POST" request.httpBody = httpBody // 记得设置Content-Type为json request.setValue("application/json", forHTTPHeaderField: "Content-Type")
注意事项
- 日期格式、时间戳单位必须和服务端完全一致,否则会出现参数解析失败的问题
- 日期格式化器、JSONEncoder建议全局复用,频繁创建会产生不必要的性能开销
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

