2015-09-21 90 views
3

我JSON有个约会 “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的好日期格式?

回答

2

这里的问题不是特定的日期格式,但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) 
+0

参考:对于直接在结合由[境界可可#1013]跟踪支持(https://github.com/realm/realm-cocoa/issues/1013)。 – marius