2015-09-21 68 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