You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:48:19