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

SwiftUI中解码JSON日期并自定义格式显示的实现方法

解决Swift JSON日期解码与SwiftUI格式化展示问题

一、JSON日期解码处理

你的JSON日期字段为ISO 8601格式,但包含不同精度的秒级小数(3位/7位),默认JSONDecoder无法直接兼容所有情况,需配置自定义日期格式化器处理:

  1. 创建兼容多精度的ISO8601日期格式化器
let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = [
    .withFullDate,
    .withTime,
    .withColonSeparatorInTime,
    .withFractionalSeconds // 支持毫秒、微秒级精度
]
  1. 配置JSONDecoder并执行解码
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(isoFormatter)

// 假设jsonData是你的JSON原始数据
do {
    let decodedResponse = try decoder.decode(JsonResponse.self, from: jsonData)
    // 解码成功,可使用decodedResponse中的日期字段
} catch {
    print("日期解码失败:\(error.localizedDescription)")
}

二、SwiftUI中按“Mon 11/22”格式展示日期

提供两种实现方式,可根据iOS版本选择:

方式1:iOS 15+ 原生FormatStyle(推荐)

直接利用SwiftUI原生特性,无需额外创建格式化器:

// 方式A:通过组合样式实现
Text(decodedResponse.startDate, format: .dateTime
    .weekday(.short) // 星期缩写(如Mon)
    .month(.twoDigits) // 两位月份
    .day(.twoDigits) // 两位日期
)

// 方式B:直接指定格式字符串
Text(decodedResponse.startDate, format: .dateFormat("EEE MM/dd"))

方式2:传统DateFormatter(兼容iOS 14及以下)

定义全局静态的DateFormatter(避免重复创建影响性能):

extension DateFormatter {
    static let shortDateStyle: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "EEE MM/dd"
        // 固定locale确保星期缩写为英文,如需中文可改为"zh_CN"
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()
}

// 在SwiftUI中调用
Text(DateFormatter.shortDateStyle.string(from: decodedResponse.startDate))

内容的提问来源于stack exchange,提问作者David Harinson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:06:43