swift 4 timeIntervalSinceReferenceDate 而不是 JSON 系列化后的实际日期字符串



>我有一个对象,我像这样设置日期的值

notificToSubmit.NotificDateCreated = Date()
notificToSubmit.NotificOccDateTime = dtPicker.date

现在我想使用 ALAMO 火将我的对象发送到我的 api。我需要将其转换为JSONObject。看起来像这样:

let data = try! JSONEncoder().encode(notifToSubmit)
let jsonD = try? JSONSerialization.jsonObject(with: data, options: .allowFragments)

一切都很好,但它给了我错误的日期值。 它给了我 timeIntervalSinceReferenceDate 而不是实际的日期值:

(2 elements)
- key: NotificDateCreated #1
- super: NSMutableString
- super: NSString
- super: NSObject
- value: 552834752.59258 #2
- super: NSNumber
- super: NSValue
- super: NSObject

而不是

NotificDateCreated: 2018-07-09 13:12:32 +0000
NotificOccuredDateTime: 2018-07-09 13:12:28 +0000

是的,我知道,数字 552834752.59258 是有效日期,但 API 无法识别它。

任何想法如何获得实际日期,即 JSON 系列化后的实际日期2018-07-09 13:12:32

如果需要日期的字符串表示形式,则可以将自定义日期编码策略传递给编码器

struct Foo : Codable {
let date : Date
}
let foo = Foo(date: Date())
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .formatted(formatter)
do {
let data = try encoder.encode(foo)
print(String(data: data, encoding:.utf8)!) // {"date":"2018-07-10 10:44:16"}
} catch {
print(error)
}

把这个留给谷歌代码勇士 -阿拉莫火 5

let encoder = JSONEncoder()
encoder.dateEncodingStrategy = JSONEncoder.DateEncodingStrategy.iso8601
AF.request(api, method: httpMethod, parameters: encodableRequestData, encoder: JSONParameterEncoder.init(encoder: encoder))

这会将可编码请求数据中的任何日期字段编码为 iso8601 字符串。 您也可以选择其他日期编码策略或创建自己的日期编码策略

最新更新