ios Swift可编码,带有自定义JSON解码器,带有自定义日期当器械未使用24小时格式时,解码策略失败

wbrvyc0a  于 2022-12-15  发布在  iOS
关注(0)|答案(1)|浏览(154)

我正在从服务器获取以下格式的日期

"endTime": "2022-12-12T16:20:00.000Z"

我正在使用Codable将json解析为对象。

internal func getDecoder() -> JSONDecoder {
    let decoder = JSONDecoder()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    decoder.dateDecodingStrategy = .formatted(dateFormatter)
    return decoder
}

当设备时间格式设置为24小时格式时,它可以很好地工作。但是如果设备时间没有设置为24小时格式,它将返回null。还有其他属性需要设置吗?

kcrjzv8t

kcrjzv8t1#

如果您在Swift中使用具有自定义dateDecodingStrategy的自定义JSON解码器,并且在设备的时间格式未设置为24小时格式时遇到解码日期问题,则有几种可能的解决方案。
一种解决方案是使用ISO 8601 DateFormatter类来解析日期字符串并将其转换为Date对象。此类旨在处理ISO 8601标准中定义的不同日期和时间格式,因此非常适合处理日期字符串中可能出现的潜在变化。以下是一个示例:
让日期格式设置程序= ISO 8601日期格式设置程序()
//将timeZone属性设置为本地时区dateFormatter。timeZone = TimeZone.current
//使用ISO 8601 DateFormatter解析日期字符串,让日期= dateFormatter.date(来自:“2022-12- 12 T12:00:00”)
另一种解决方案是使用DateFormatter类并显式设置其dateFormat属性,以匹配您尝试解码的日期字符串的格式。这使您可以指定日期字符串的确切格式,并确保DateFormatter能够正确地分析它。下面是一个示例:
让日期格式设置程序=日期格式设置程序()
//设置dateFormat属性以匹配日期字符串dateFormatter的格式。dateFormat =“yyyy-MM-dd 'T'HH:mm:ss”
//将timeZone属性设置为本地时区dateFormatter。timeZone = TimeZone.current
//使用DateFormatter解析日期字符串,让date = dateFormatter.date(来自:“2022-12- 12 T12:00:00”)
将日期字符串解析为Date对象后,就可以在使用自定义的JSONDecoder和dateDecodingStrategy解码JSON数据时使用该对象。这样,无论设备的时间格式如何,都可以正确解码JSON数据中的日期。
请注意,在这两个示例中,将DateFormatter或ISO 8601 DateFormatter的timeZone属性设置为本地时区非常重要。这可确保针对设备的时区正确调整解析的Date对象,这对于确保正确解码日期非常重要。

相关问题