2015-09-21 3 views
3

Я имел JSON с датой "date_use":формат даты Realm 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», причина: «Недопустимое значение» 2015-07-04T00: 00: 00Z 'для свойства' date_use '

Мой вопрос: Каков хороший формат даты для Realm?

ответ

2

Проблема здесь не в конкретном формате даты, но что 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) 
+0

Для справки: поддержка, которые непосредственно в связывании отслеживается [область-какао # 1013] (https://github.com/realm/realm-cocoa/issues/1013). – marius

Смежные вопросы