JSONSerialization后迅速4 timeIntervalSinceReferenceDate而不是实际日期字符串

时间:2018-07-09 13:26:11

标签: json alamofire swift4 datetimepicker

我有一个这样的对象

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

现在,我想使用ALAMO fire将对象发送到我的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无法识别。

Any Ideas如何在JSONSerialization之后获取 2018-07-09 13:12:32 的实际日期

3 个答案:

答案 0 :(得分:1)

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

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)
}

答案 1 :(得分:0)

将其留给Google Code Warriors- Alamofire 5

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

这会将encodableRequestData中的任何Date字段编码为iso8601字符串。您也可以选择其他DateEncodingStrategies或自己制作

答案 2 :(得分:-1)

我需要尽快完成此操作,所以我的快速解决方案是将日期属性更改为字符串,并创建将Date转换为string,然后再次从String转换为Date的函数。我知道这不是最好的,但是人们正在呼吸我的脖子,我需要做到这一点。

如果有人有更好的解决方案,请务必!