Проблема здесь не в конкретном формате даты, но что JSON не поддерживает родной тип даты вообще. Поэтому вам нужно сериализовать даты в строковый формат. Использование RFC 3339, как и для вас, имеет хороший выбор, поскольку оно позволяет избежать двусмысленностей, поэтому вы можете придерживаться этого.
Realm's 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)
Для справки: поддержка, которые непосредственно в связывании отслеживается [область-какао # 1013] (https://github.com/realm/realm-cocoa/issues/1013). – marius