【问题标题】:Realm format date JSON swift领域格式日期JSON swift
【发布时间】:2015-12-18 05:43:09
【问题描述】:

我有一个日期为“date_use”的 JSON:

 {"expense":
    {"id":1,
    "amount":123.3,
    "date_use":"2015-07-04T00:00:00Z"}
 }

执行此代码时,日期格式出现错误:

self.realm!.create(Expense.self, value:json["expense"].object, update: true)

错误:

由于未捕获的异常“RLMException”而终止应用程序,原因: '属性'date_use'的'无效值'2015-07-04T00:00:00Z'

我的问题是:Realm 的好的日期格式是什么?

【问题讨论】:

    标签: json swift2 realm


    【解决方案1】:

    这里的问题不是特定的日期格式,而是 JSON 根本不支持原生日期类型。因此,您必须将日期序列化为字符串格式。使用RFC 3339,就像你必须处理的那样,通常是一个不错的选择,因为它可以避免歧义,所以你可以坚持下去。

    Realm 的 create 方法不需要反序列化的 JSON,而是对象的字典表示。这要求您已经完成了将日期字符串表示转换回 Cocoa 的本机类型 NSDate 的预处理步骤。这不是自动完成的,因为有些日期格式不明确(与您的不同),例如不提供有关时区的信息。

    好消息是有优秀的第三方库,例如Realm-JSON,这使得处理它变得容易多了。它为此带来了内置支持。 这也将允许映射您的 API 返回的属性命名方案,例如date_use 的名称符合更广泛使用的驼峰式 dateUse

    如果您不想仅为该用例引入另一个依赖项,则可以使用和 configure NSDateFormatter 来解析符合 RFC 3339 标准的特定子集的日期,假设它们始终使用 UTC 作为时区,标记为Z 后缀。

    // Setup the RFC 3339 date formatter
    let rfc3339DateFormatter = NSDateFormatter()
    let enUSPOSIXLocale = NSLocale(localeIdentifier: "en_US_POSIX")
    rfc3339DateFormatter.locale = enUSPOSIXLocale
    rfc3339DateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
    rfc3339DateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    
    // Convert the RFC 3339 date time string to an NSDate
    var json: AnyObject! = nil
    var value = json["expense"] as! [String : AnyObject]
    let date: NSDate?
    if let dateString = value["date_use"] as? String {
        date = rfc3339DateFormatter.dateFromString(dateString)
    } else {
        date = nil
    }
    value["date_use"] = date
    
    // Create your object
    self.realm!.create(Expense.self, value: value, update: true)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多