Swift 中 JSON 日期与 Swift 原生日期 Date 类型互相转换
· 阅读需 3 分钟
Swift 中 JSON 日期与 Swift 原生日期 Date 类型互相转换,JSON 解码器和编码器提供不同的日期编码策略。我们 可以在以下策略中进行选择:
- .deferredToDate
- .iso8601
- .millisecondsSince1970
- .secondsSince1970
- .formatted(DateFormatter)
- .custom((Decoder) -> Date)
在本文中,我们将更详细地研究每种策略。让我们开始吧。
.deferredToDate 策略是使用 Apple 自己的日期格式的默认策略。它是相对于 2001 年 1 月 1 日午夜 UTC 的秒数。按如下方式对日期进行编码时:
let jsonEncoder = JSONEncoder()
jsonEncoder.dateEncodingStrategy = .deferredToDate
let article = Article(date: Date())
let encodedArticle = try jsonEncoder.encode(article)
print(String(data: encodedArticle, encoding: .utf8)!)
我们得到以下输出:
{ "date" : 695980776.16554499 }
策略 .iso8601
.iso8601 策略根据 ISO 8601 标准格式化日期,该标准是涵盖全球日期和时间相关数据交换的国际标准。
将上面的示例更改为此策略时,我们得到以下输出:
{ "date" : "2023-01-21T07:59:36Z" }
T 字符是时间值之前的时间标识符。
Z 字符是时区标识符,指示时区是 UTC。它只需要附加到时间值。
策略 .millisecondsSince1970
此策略解码自 1970 年 1 月 1 日午夜 UTC 以来的毫秒数。
{ "date" : 1674287976165.5449 }
策略 .secondsSince1970
此策略解码自 1970 年 1 月 1 日午夜 UTC 以来的秒数。
{ "date" : 1674287976.165545 }
策略 .formatted(DateFormatter)
此策略允许我们设置任何自定义日期格式化程序,例如:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
jsonEncoder.dateEncodingStrategy = .formatted(dateFormatter)
它提供以下输出:
{ "date": "2023-01-21" }
策略 .custom((解码器) -> 日期)
这种策略给了我们最大的灵活性,例如,如果我们需要为日期编码添加一些条件。
jsonEncoder.dateEncodingStrategy = .custom({ date, encoder in
var container = encoder.singleValueContainer()
try container.encode("Some custom date encoding \(date.description)")
})
它提供以下输出:
{ "date": "Some custom date encoding 2023-01-21 07:59:36 +0000" }