JSON ISO8601形式の日付は単なる文字列であるため、それらを解析するだけの魔法の方法はありません。解析する必要のあるフィールドを宣言または検出する必要があります。
宣言は簡単です。モデルに日付フィールドの配列を定義し、それぞれを解析するだけです。
//declare dateFields on the model
var TestModel = Backbone.Model.extend({
dateFields: [
'createdDate',
'updatedDate'
]
});
//override toJSON
Backbone.Model.prototype.toJSON = function() {
return this._parseDates(this.attributes);
};
//hydrates string dates to Date objects
Backbone.Model.prototype._parseDates = function(attrs) {
attrs = _.clone(attrs);
if(!this.dateFields) { return attrs; }
_.each(this.dateFieds, function(field) {
attrs[field] = new Date(attrs[field]);
});
return atts;
};
そのためには、どのフィールドを検討するかを日付パーサーに指示する必要があります。もっと自動魔法のようなものを望んでいたので、他のオプションは、各文字列値の形状を見て、どのフィールドが日付であるかを検出しようとすることです。
//hydrates string dates to Date objects
Backbone.Model.prototype._parseDates = function(attrs) {
attrs = _.clone(attrs);
var iso8601Pattern = /^[0-9][0-9][0-9][0-9](-[0-1][0-9](-[0-3][0-9](T[0-9][0-9](:[0-9][0-9](:[0-9][0-9])(\.[0-9][0-9][0-9]?)?)?)?)?)?Z$/;
_.each(attrs, function(value, key) {
if(_.isString(value) && iso8601pattern.test(value)) {
attrs[key] = new Date(value);
}
});
return attrs;
};
これは、すべての日付フィールドをリストする必要はありませんが、各値をテストして日付のように見えるかどうかを確認する必要があるため、解析にオーバーヘッドが追加されます。