Javascript 更改JSON内部数据格式的更好方法(Regex?!)

Javascript 更改JSON内部数据格式的更好方法(Regex?!),javascript,json,regex,date,datetime,Javascript,Json,Regex,Date,Datetime,我的CRM将以下JSON发送到我的webhook: "last_conversion": { "content": { "identifier":"conv-list", "created_at":"2020-05-09T22:06:29.049670Z", "Name":"Test",

我的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"
}  
为了实现这一点,我应该在关键点更改两个

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


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

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

const date = new Date("2020-05-09T22:06:29.049670Z")
完成此操作后,您可以使用格式化数据


要想在JS中处理日期时获得更愉快的体验,还可以查看。

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

const date = new Date("2020-05-09T22:06:29.049670Z")
完成此操作后,您可以使用格式化数据


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

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

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"
}]
如果不接受该格式,您可以使用
库或类似的日期格式化程序库。以下是一个可能的数据格式化程序:

// @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()
    }
});

目前还不完全清楚您的数据的完整格式,因此我假设这是更大数组的一部分,例如:

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"
}]
如果不接受该格式,您可以使用
库或类似的日期格式化程序库。以下是一个可能的数据格式化程序:

// @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()
    }
});

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