当前位置: 首页 > 面试题库 >

使用swift4的iso8601日期json解码

訾俊名
2023-03-14
问题内容

所以,我的json中有iso8601日期,看起来像“ 2016-06-07T17:20:00.000 + 02:00”

有没有办法使用swift4解析这些iso8601日期?我缺少明显的东西吗?

我尝试了以下操作,但是仅jsonShipA中的dateString“ 2016-06-07T17:20:00Z”是可解析的…。

import Foundation

struct Spaceship : Codable {
    var name: String
    var createdAt: Date
}

let jsonShipA = """
{
    "name": "Skyhopper",
    "createdAt": "2016-06-07T17:20:00Z"
}
"""

let jsonShipB = """
{
    "name": "Skyhopper",
    "createdAt": "2016-06-07T17:20:00.000+02:00"
}
"""

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601

let dataA = jsonShipA.data(using: .utf8)!
if let decodedShip = try? decoder.decode(Spaceship.self, from: dataA) {
    print("jsonShipA date = \(decodedShip.createdAt)")
} else {
    print("Failed to decode iso8601 date format from jsonShipA")
}

let dataB = jsonShipB.data(using: .utf8)!
if let decodedShip = try? decoder.decode(Spaceship.self, from: dataB) {
    print("jsonShipA date = \(decodedShip.createdAt)")
} else {
    print("Failed to decode iso8601 date format from jsonShipB")
}

游乐场的输出为:

jsonShipA date = 2016-06-07 17:20:00 +0000
Failed to decode iso8601 date format from jsonShipB

引发的错误是“预期日期字符串为ISO8601格式”。但是据我所知,日期“ 2016-06-07T17:20:00.000 +
02:00”是有效的ISO8601日期


问题答案:

您可以这样使用:

enum DateError: String, Error {
    case invalidDate
}

let decoder = JSONDecoder()

let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)

decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
    let container = try decoder.singleValueContainer()
    let dateStr = try container.decode(String.self)

    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
    if let date = formatter.date(from: dateStr) {
        return date
    }
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
    if let date = formatter.date(from: dateStr) {
        return date
    }
    throw DateError.invalidDate
})


 类似资料:
  • 问题内容: 我正在尝试对JavaScript应用程序中的日期进行序列化/反序列化。 服务器端,我使用Java,JodaTime已安装在上面。我发现了如何使用UTC时区序列化为ISO,但是找不到如何进行反向操作。 这是我的代码 我不在乎是否使用Joda,只需要一个快速且有效的解决方案, 问题答案: 如果您使用的是Java 7或更早版本,则可以参考此文章。 如果您使用的是Java 8,则可以执行以下操

  • 问题内容: 很好,但这忽略了毫秒,如何在不使用非线程安全的情况下获取日期呢? https://github.com/FasterXML/jackson- databind/blob/master/src/main/java/com/fasterxml/jackson/databind/util/ISO8601DateFormat.java 问题答案: Calls ,反过来又调用- 参数告诉Jack

  • 有没有办法将ISO8601日期与Java进行比较?比如,知道字符串日期是否是良好的格式,知道月份是否为负数,以及 我还在搜索如何知道互联网上是否有课程可以比较两个ISO8601日期?比如,如果我有:2000-12-12和1999-05-06。我如何比较这两个日期,使之在年、月和日之间有准确的差异?

  • 问题内容: 我从声称的API获取下一个字符串 所有日期格式均为ISO8601。 我正在尝试下一个代码: 不幸的是,结果 updatedAt 为nil 问题答案: 您的日期格式不正确,您需要考虑毫秒。 需要澄清的是,在日期格式中添加可以解决此问题。

  • 在使用date格式自动设置为IE后,我试图解析某个包含日期条目为纪元数值的json文档。我需要不同的格式(也需要一毫秒) 所以问题是,如何解析IE。转换为带有Bson文档的某种自定义格式字符串。解析方法? 编辑:只是一个更新:问题在document.parse方法中,因为我不知道如何在解析json文档时使用tell.parse函数来使用自定义的日期格式。我总是得到某种默认的日期格式。如何发送给.p

  • 问题内容: 我正在使用bootstrap-datetimepicker和ISO8601 datetime格式,如其选项部分所述 在我的控制器中 它以(console.log)将数据发送到后端 并保存为数据库 在我的模板中 我在HTML上看到的输出为 但是根据Angular doc,它应该用于格式 我想念的是什么? 问题答案: 现在,我已经创建了一个过滤器 作为依赖项添加为 并用作 并将日期显示为