我有一个日期为“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)
错误:
Terminating app due to uncaught exception 'RLMException', reason: 'Invalid value '2015-07-04T00:00:00Z' for property 'date_use'
我的问题是:什么是适合 Realm 的日期格式?
最佳答案
这里的问题不是特定的日期格式,而是 JSON 根本不支持 native 日期类型。所以你必须将日期序列化为字符串格式。使用RFC 3339 ,就像你必须处理的那样,通常是一个不错的选择,因为它避免了歧义,所以你可以坚持下去。
Realm 的 create
方法不期望反序列化的 JSON,而是对象的字典表示。这期望您已经完成将日期字符串表示形式转换回 Cocoa 的原生类型 NSDate
的预处理步骤。这不会自动完成,因为日期格式不明确(与您的不同),例如不提供有关时区的信息。
好消息是有优秀的第三方库,例如Realm-JSON ,这使得处理它变得容易得多。它为此提供了内置支持。
这也将允许映射您的 API 返回的属性命名方案,例如date_use
为符合更广泛使用的驼峰式 dateUse
的名称。
如果您不想仅为该用例引入另一个依赖项,您可以使用 and 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)
关于json - Realm 格式日期 JSON swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32696663/