【问题标题】:How to send iso 8601 date to Backend?如何将 iso 8601 日期发送到后端?
【发布时间】:2021-12-18 09:03:47
【问题描述】:

我有一个小问题。

我正在尝试向我的后端发送一个带有 Post 请求的日期,但后面没有任何内容。请求发送成功,因为除了 Date 之外的所有数据都到了后端。

这是需要在后端的:

 "date": "2021-12-17T17:52:27.724773",

这是我尝试过的:

    let isoDate = "021-12-17T17:52:27.724773"
        let isoDateFormatter = ISO8601DateFormatter()
        isoDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
        isoDateFormatter.formatOptions = [
            .withFullDate,
            .withFullTime,
            .withDashSeparatorInDate]

        if let realDate = isoDateFormatter.date(from: isoDate) {

            order.date = realDate. // order.date is of type : Date

        }
       

需要做什么?

【问题讨论】:

  • 我无法想象为什么后端开发人员会需要如此深奥的日期值格式。我认为这是一种糟糕的设计实践。远程数据应尽可能简单且不可知,日期值应类似于 Unix 时间戳、普通 32 位或 64 位整数。如果客户端或服务器功能需要更花哨的东西,那就让他们转换吧。

标签: swift dateformatter


【解决方案1】:

您似乎是在倒退,如果您的后端需要特定格式的日期和时间,您应该将 Date 实例转换为字符串,而不是相反。

ISO8601DateFormatter 不支持毫秒的 6 位小数,因此您需要标准的 DateFormatter

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"

请注意,即使是 DateFormatter 也不真正支持 6 位数字,仅支持 3 位,因此生成的日期字符串将始终以“000”结尾

后端格式不包含时区,因此可能会假定这是一个特定的时区,然后您需要在格式化程序上也进行设置,例如:

formatter.timeZone = TimeZone(secondsFromGMT: 0) 

要使用它,您可以执行以下操作

order.date = Date() // or some other Date object

let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .formatted(formatter)
let data = try encoder.encode(order)

【讨论】:

  • let order = Order() let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS" formatter.timeZone = TimeZone(secondsFromGMT: 0) let encoder = JSONEncoder() encoder.dateEncodingStrategy = .formatted(formatter) let data = try? encoder.encode(order.date) order.date = data 谢谢!我试图做这样的事情但没有工作,我收到了这个错误:“无法分配'数据类型的值?'输入“日期?””,因为数据是数据类型
  • 您应该对整个订单对象进行编码,而不仅仅是 order.date
  • 我只是假设您想将 json 发送到后端因此编码
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多