Swift中使用JSONDecoder解析yyyy-MM-dd日期返回带时分秒的问题
解析"yyyy-MM-dd"日期字符串时分秒问题及修复方案
为什么Date对象会显示时分秒?
Swift的Date是代表时间点的结构体,底层基于UTC时间戳实现,本身必然包含时分秒信息。直接打印Date对象时,系统会默认用UTC时区输出完整时间格式(含时分秒),这是正常现象——若需展示不带时分秒的日期,只需用DateFormatter指定yyyy-MM-dd格式转换输出即可,无需修改Date对象本身。
你代码中返回错误日期的原因
你先调用了try parse(data: data)获取foo,但这个自定义parse函数并未使用后续配置好的JSONDecoder(未应用自定义日期格式策略)。默认解码策略无法解析"yyyy-MM-dd"格式的字符串,导致解码失败返回Date的初始值2000-01-01 00:00:00 +0000。
修复后的完整代码
import Foundation struct Foo: Decodable { let date: Date } let string = """ {"date": "2023-10-19"} """ let data = Data(string.utf8) // 配置日期解析器 let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" // 显式设置时区,避免本地时区导致的解析偏差 formatter.timeZone = TimeZone(identifier: "UTC") // 配置JSON解码器 let decoder = JSONDecoder() decoder.dateDecodingStrategy = .formatted(formatter) do { let swiftObject = try decoder.decode(Foo.self, from: data) print("解码后的Date对象:\(swiftObject.date)") // 按需转换为不带时分秒的格式输出 print("格式化后的日期:\(formatter.string(from: swiftObject.date))") } catch { print("解码错误:\(error)") }
输出结果
解码后的Date对象:2023-10-19 00:00:00 +0000 格式化后的日期:2023-10-19
关键注意事项
- 必须使用配置好自定义日期策略的
JSONDecoder进行解码,避免混用未配置的解析函数 - 解析日期时建议显式设置时区,消除不同时区环境下的解析差异
Date对象的默认显示格式不影响其实际时间值,如需特定格式展示,通过DateFormatter转换即可
内容的提问来源于stack exchange,提问作者Eduardo Oliveros
相关产品推荐
相关产品推荐

