swift 4 timeIntervalSinceReferenceDate 而不是 JSONSerialization 之后的实际日期字符串

Posted

技术标签:

【中文标题】swift 4 timeIntervalSinceReferenceDate 而不是 JSONSerialization 之后的实际日期字符串【英文标题】:swift 4 timeIntervalSinceReferenceDate instead of actual date string after JSONSerialization 【发布时间】:2018-07-09 13:26:10 【问题描述】:

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

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 无法识别它。

任何想法如何在 JSONSerialization 之后获得 2018-07-09 13:12:32 的实际日期

【问题讨论】:

JSONEncoderDate 实例编码为 IntDoubleString,具体取决于日期策略,因为 JSON 不支持 Date。 API 期望的类型是什么? 你好@vadian 它需要一个字符串类型的日期格式。你是对的,JSONEncoder 有这个限制,所以我需要将我所有的日期属性转换为字符串,并创建一个函数来执行 .toString 和 toDate。现在可以用了,谢谢 JSON 格式有这个限制,而不是JSONEncoder。我写了一个建议一个聪明的解决方案的答案。 【参考方案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)

【讨论】:

【参考方案2】:

把这个留给 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 中的任何日期字段编码为 iso8601 字符串。您也可以选择其他 DateEncodingStrategies 或自己制作

【讨论】:

勇士批准!这非常适合使用 Date 对象并将数据发送到带有 createdAt、updatedAt 日期字段的 Node.js / MongoDB 实现。谢谢!我很惊讶这个解决方案没有被广泛采用 b/c 没有多少日期映射编码/解码与 AF。【参考方案3】:

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

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

【讨论】:

以上是关于swift 4 timeIntervalSinceReferenceDate 而不是 JSONSerialization 之后的实际日期字符串的主要内容,如果未能解决你的问题,请参考以下文章

Swift:使用 strftime 和 localtime 格式化 NSDate

使用 timeIntervalSince1970 转换时,如何使 fileCreationDate 精确到小数点后 6 位?

Swift3.0 GCD定时器的使用,实现倒计时,UIDatePicker的使用, 仿写一个活动倒计时的DEMO

swift swift_optional4.swift

swift 如何将Swift 3内置的cocoapod更新为Swift 4

如何使用CKNotification?