【问题标题】:Parsing dates in JSON in d3/observablehq在 d3/observablehq 中以 JSON 格式解析日期
【发布时间】:2021-07-29 17:00:58
【问题描述】:

我有一个带有 ISO8601 日期的 JSON 文件:

[
 {
  started_at: "2021-05-06T21:13:03.620Z",
  ...
 },
 ...
]

要使用这些日期值,需要对其进行解析,但最简单的方法是什么?现在我已将 JSON 附加到可观察笔记本并加载它:

all_jobs = FileAttachment("pipeline.json").json()

然后遍历数组以修复类型:

{
for (let i = 0; i < all_jobs.length; i++) {
  if (all_jobs[i].started_at)
    all_jobs[i].started_at = new Date(all_jobs[i].started_at);

  if (all_jobs[i].finished_at)
    all_jobs[i].finished_at = new Date(all_jobs[i].finished_at);
}
return all_jobs;
}

但这显然是可怕的。一定有更好的解决方案,是什么?

【问题讨论】:

  • 这并不可怕。 JSON 是文本,因此如果您需要将日期作为 JS 类型,那么使用 new Date(...) 是可行的方法

标签: javascript json d3.js


【解决方案1】:

您可以遍历对象并将 ISO 时间戳替换为 Date 对象,例如:

function isISODate(s) {
    return /(\d{4})-(\d{2})-(\d{2})T(\d{2})\:(\d{2})\:(\d{2})(\.\d{3})?(Z|([+-]\d{2})\:(\d{2}))/.test(s)
}

function replaceDates(obj) {
    for (const key in (obj)) {
        if (typeof obj[key] == "object") {
            replaceDates(obj[key]);
        } else {
            obj[key] = isISODate(obj[key]) ? new Date(obj[key]): obj[key];
        }
    }
}

let obj = [{ foo: { a: 42, bar: '2021-05-07T09:28:48Z' }}];

console.log("Original:", obj)
replaceDates(obj);
console.log("Modified:", obj)
console.log("Modified date:", obj[0].foo.bar.toString())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多