SwiftUI中解码JSON日期并自定义格式显示的实现方法
解决Swift JSON日期解码与SwiftUI格式化展示问题
一、JSON日期解码处理
你的JSON日期字段为ISO 8601格式,但包含不同精度的秒级小数(3位/7位),默认JSONDecoder无法直接兼容所有情况,需配置自定义日期格式化器处理:
- 创建兼容多精度的ISO8601日期格式化器
let isoFormatter = ISO8601DateFormatter() isoFormatter.formatOptions = [ .withFullDate, .withTime, .withColonSeparatorInTime, .withFractionalSeconds // 支持毫秒、微秒级精度 ]
- 配置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
相关产品推荐
相关产品推荐

