Как отформатировать дату JSON в Javascript? - PullRequest
3 голосов
/ 26 марта 2010

Я передаю дату из Ruby в Javascript через JSON.

Он входит в Javascript как "2010-03-24T10: 00: 00Z".

Теперь, как, черт возьми, мне отформатировать это в Javascript?

Ответы [ 3 ]

2 голосов
/ 29 марта 2010

В соответствии со спецификацией 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 Дугласа Крокфорда.

2 голосов
/ 06 июля 2012

Почему бы просто не передать его как метку времени, а не как дату, и умножить на 1000?

new Date( ruby_val * 1000 );
1 голос
/ 27 марта 2010

Полагаю, я бы сделал это примерно так, чтобы сначала построить объект даты:

function dp(dateStr) {
    var pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/;
    var match = pattern.exec(dateStr);
    if (!match) {throw new Error('::Error, #dp could not parse dateStr '+dateStr);}
    // we're safe to use the fields
    return new Date(match[1], match[2]-1, match[3], match[4], match[5], match[6]);
}
console.log(dp('2010-03-24T10:00:00Z'));

Тогда я мог бы красиво распечатать его по-разному. Посмотрите, как должен быть изменен месяц (поле с idx 2 в массиве совпадений) из-за нулевого индекса (в отличие от поля даты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...