【问题标题】:How to format JSON date in Javascript?如何在 Javascript 中格式化 JSON 日期?
【发布时间】:2010-03-26 19:26:22
【问题描述】:

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

它以“2010-03-24T10:00:00Z”进入 Javascript。

现在,我该怎么用 Javascript 格式化它?

【问题讨论】:

  • 谢谢,但我没有找到任何有用的东西,或者做我想做的事。唯一似乎有效的是“Yet Another Pretty Date JavaScript”,但它只返回“2 天前”之类的内容,这不是我要查找的信息。
  • 在你可以格式化之前,首先你解析(这是那个链接说明的)。

标签: javascript ruby-on-rails json


【解决方案1】:

根据 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 源代码。

【讨论】:

    【解决方案2】:

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

    new Date( ruby_val * 1000 );
    

    【讨论】:

    • 我认为这更有意义。在 Rails 模型上覆盖 as_json 以输出 unix 时间戳,在客户端只需从 unix 时间戳创建一个日期对象。
    【解决方案3】:

    我想我会先这样构造一个日期对象:

    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 的字段)由于零索引(与日期字段相反)需要如何调整。

    【讨论】:

    • (-1) 使用正则表达式解析日期通常是个坏主意。很难解释所有的变化。最好通常把它留给认真解决问题的 API。请参阅@Crescent 发表的评论以获得更好的选择。
    • 嗯?这是一个非常明确的任务,具有非常知名的格式。 Date.parse 函数也不可靠。标准中甚至没有任何内容表明它应该适用于例如“2010-02-23T23:04:48Z”这样的字符串。所以我们有正则表达式。如果非常需要,当然还有更多的检查要做(例如检查每个检索字段的边界)。
    • +1 @harschware 日期表示是一个主要问题,因为即使是标准化格式(RFC822、RFC3339、..)也包含高度可变性,并且日期通常不伴随用于表示它们,因此完全不可能编写标准化的日期解析器,因此我们基本上只能尝试各种格式。有问题的格式是ISO 8601,这是相当标准化的,我认为用正则表达式解析它没有问题。正则表达式并不邪恶。
    • 确定你可以用正则表达式处理它,但我更重要的一点是,如果你能帮助它,你不应该尝试重新发明轮子。只需查看@Fabian 的帖子:它使用 API (json2),并且该正则表达式与 @npup 的有明显差异,这表明您的可能遗漏了一些重要的变化,并且没有正确考虑时区处理。在这种情况下,我应该让反对票成立。
    • @harschware 如果有人可以依靠Date.parse() 在所有浏览器中完成这项工作,我会去做。但事实并非如此。当然,当您将自己的充分发挥时,还有更多检查(如您提到的日期值和时区的约束)要做。我没有把这里的问题读成“制作一个完整的日期解析器来处理世界各地的任何事情”,而是“如何在javascript中格式化日期字符串”。 字符串!我的方法是字符串很好,我想把它放在一个日期中,以便之后轻松格式化它以使我满意
    猜你喜欢
    • 2021-12-15
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多