如何将 iso 8601 日期发送到后端?

Posted

技术标签:

【中文标题】如何将 iso 8601 日期发送到后端?【英文标题】:How to send iso 8601 date to Backend? 【发布时间】: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 位整数。如果客户端或服务器功能需要更花哨的东西,那就让他们转换吧。 【参考方案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 发送到后端因此编码

以上是关于如何将 iso 8601 日期发送到后端?的主要内容,如果未能解决你的问题,请参考以下文章

将 ISO 8601 日期时间字符串转换为 **Date** 对象时,如何将日期时间重新定位到当前时区?

如何将交易从元掩码钱包发送到后端节点 js

Javascript - 将 ISO8601 UTC 时间转换为客户端的本地时间 [重复]

当用户单击链接时,如何通过请求将身份验证令牌从本地存储发送到后端

前端发送数据到后端

将浏览器时区传递到后端spring引导应用程序,以根据浏览器时区生成包含日期的报告