如何在Javascript中格式化JSON日期?

时间:2010-03-26 19:26:23

标签: javascript ruby-on-rails json

我通过JSON将日期从Ruby传递给Javascript。

它在Javascript中被称为“2010-03-24T10:00:00Z”。

现在,我如何在Javascript格式化它?

3 个答案:

答案 0 :(得分:2)

根据EcmaScript 5规范,JSON日期应编码为ISO字符串。这就是JavaScript日期对象toJSON的样子:

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似乎以相同的方式编码日期。一个优雅的解决方案是为JSON解析函数提供一个reviver函数,该函数将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实现。

这两个样本均来自Douglas Crockford的json2源代码。

答案 1 :(得分:2)

为什么不把它作为时间戳而不是日期传递并乘以1000?

new Date( ruby_val * 1000 );

答案 2 :(得分:1)

我想我先做这样的事情来构建一个日期对象:

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的字段)需要如何摆弄。