【问题标题】:Better way to change data format inside JSON (Regex ?!) [duplicate]在 JSON 中更改数据格式的更好方法(正则表达式?!)[重复]
【发布时间】:2020-08-25 12:41:05
【问题描述】:

我的 CRM 将以下 JSON 发送到我的 webhook:

"last_conversion":
            {
                "content":
                {
                    "identifier":"conv-list",
                    "created_at":"2020-05-09T22:06:29.049670Z",
                    "Name":"Test",
                    "BusinessName":"Test Business",
                    "Phone":"+201 (99) 9999-9999",
                    "gclid_field":"232938293"
                },
                "created_at":"2020-05-09T19:06:29.049-05:00"
}

向谷歌广告发送信息需要特定的数据格式:

我想创建一个格式如下的json:

{
"content_created_at":"2020-05-09T22:06:29-05:00",
"Name":"Test",
"created_at": "2020-05-09T19:06:29-05:00"
}  

为此,我应该更改两个 created_at 键

1) 2020-05-09T22:06:29.049670Z 到 2020-05-09T22:06:29-05:00(删除 .049670Z 并添加 -05:00

2) 2020-05-09T19:06:29.049-05:00 到 2020-05-09T19:06:29-05:00(删除 .049

实现这一目标的最优雅方式是什么?我正在尝试某种正则表达式,但没有按预期工作

【问题讨论】:

  • 您不能使用正则表达式添加偏移量,因为正则表达式不知道它是什么,也不知道如何调整日期和时间值。您可以将字符串转换为日期并根据需要对其进行格式化,这里已经有很多关于格式化日期的问题。

标签: javascript json regex date datetime


【解决方案1】:

尚不完全清楚您的数据的完整格式是什么,所以我假设这是一个更大数组的一部分,例如:

data = [{
    "last_conversion": {
        "content": {
            "identifier": "conv-list",
            "created_at": "2020-05-09T22:06:29.049670Z",
            "Name": "Test",
            "BusinessName": "Test Business",
            "Phone": "+201 (99) 9999-9999",
            "gclid_field": "232938293"
        },
        "created_at": "2020-05-09T19:06:29.049-05:00"
    }
}];

使用上述数组,您可以使用toJSON()(或toISOString())这样的格式,这将为您提供这些日期的ISO格式:

updated = data.map(record => {
    return {
        Name: data[0].last_conversion.content.Name,
        created_at: new Date(data[0].last_conversion.created_at).toJSON(),
        content_created_at: new Date(data[0].last_conversion.content.created_at).toJSON()
    }
});

这会产生如下数据:

[{
    "Name": "Test",
    "created_at": "2020-05-10T00:06:29.049Z",
    "content_created_at": "2020-05-09T22:06:29.049Z"
}]

如果该格式不被接受,您可以使用moment 库或类似的日期格式化程序库。这是一个可能的数据格式化程序:

// @credit to 
// https://stackoverflow.com/a/56709229/886437
// by https://stackoverflow.com/users/392145/nahuel-greco
function dateToLocalISO(date) {
    const off    = date.getTimezoneOffset()
    const absoff = Math.abs(off)
    return (new Date(date.getTime() - off*60*1000).toISOString().substr(0,23) +
            (off > 0 ? '-' : '+') + 
            (absoff / 60).toFixed(0).padStart(2,'0') + ':' + 
            (absoff % 60).toString().padStart(2,'0'))
}

updated = data.map(record => {
    return {
        Name: data[0].last_conversion.content.Name,
        created_at: dateToLocalISO(new Date(data[0].last_conversion.created_at)),
        content_created_at: new Date(data[0].last_conversion.content.created_at).toJSON()
    }
});

【讨论】:

    【解决方案2】:

    您不需要在这里使用正则表达式。 只需将日期字符串转换为 JS Date 对象即可:

    const date = new Date("2020-05-09T22:06:29.049670Z")
    

    完成此操作后,您可以使用date methods 来格式化您的数据。

    为了在 JS 中处理日期时获得更愉快的体验,您还可以查看moment.js

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-31
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多