领域格式日期 JSON swift
Realm format date JSON swift
我有 JSON 日期 "date_use" :
{"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 根本不支持本机日期类型。所以你必须将日期序列化为字符串格式。使用 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)
我有 JSON 日期 "date_use" :
{"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 根本不支持本机日期类型。所以你必须将日期序列化为字符串格式。使用 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)