В соответствии со спецификацией EcmaScript 5 даты JSON должны быть закодированы как строки ISO. Вот как toJSON
объектов даты в JavaScript может выглядеть так:
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? '0' + n : n;
}
Date.prototype.toJSON = function (key) {
return isFinite(this.valueOf()) ?
this.getUTCFullYear() + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate()) + 'T' +
f(this.getUTCHours()) + ':' +
f(this.getUTCMinutes()) + ':' +
f(this.getUTCSeconds()) + 'Z' : null;
};
К счастью, Ruby, похоже, кодирует даты одинаково. Элегантное решение заключается в предоставлении функции reviver для функции синтаксического анализа JSON, которая преобразует строки даты ISO в объекты Date:
myData = JSON.parse(text, function (key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
}
}
return value;
});
Это должно работать со всеми стандартными совместимыми реализациями JSON.
Оба образца взяты из исходного кода json2 Дугласа Крокфорда.