Ini adalah sesuatu yang sangat rapi dan sederhana (setidaknya saya percaya begitu :)) dan tidak memerlukan manipulasi tanggal untuk dikloning atau membebani fungsi asli browser apa pun seperti toJSON (referensi: Cara JSON merangkai javascript Tanggal dan mempertahankan zona waktu , sopan Shawson)
Teruskan fungsi pengganti ke JSON.stringify yang merangkai barang sesuka hati !!! Dengan cara ini Anda tidak perlu melakukan perbedaan jam dan menit atau manipulasi lainnya.
Saya telah memasukkan console.logs untuk melihat hasil antara sehingga jelas apa yang terjadi dan bagaimana rekursi bekerja. Itu mengungkapkan sesuatu yang perlu diperhatikan: nilai param to replacer sudah dikonversi ke format tanggal ISO :). Gunakan [kunci] ini untuk bekerja dengan data asli.
var replacer = function(key, value)
{
var returnVal = value;
if(this[key] instanceof Date)
{
console.log("replacer called with key - ", key, " value - ", value, this[key]);
returnVal = this[key].toString();
/* Above line does not strictly speaking clone the date as in the cloned object
* it is a string in same format as the original but not a Date object. I tried
* multiple things but was unable to cause a Date object being created in the
* clone.
* Please Heeeeelp someone here!
returnVal = new Date(JSON.parse(JSON.stringify(this[key]))); //OR
returnVal = new Date(this[key]); //OR
returnVal = this[key]; //careful, returning original obj so may have potential side effect
*/
}
console.log("returning value: ", returnVal);
/* if undefined is returned, the key is not at all added to the new object(i.e. clone),
* so return null. null !== undefined but both are falsy and can be used as such*/
return this[key] === undefined ? null : returnVal;
};
ab = {prop1: "p1", prop2: [1, "str2", {p1: "p1inner", p2: undefined, p3: null, p4date: new Date()}]};
var abstr = JSON.stringify(ab, replacer);
var abcloned = JSON.parse(abstr);
console.log("ab is: ", ab);
console.log("abcloned is: ", abcloned);
/* abcloned is:
* {
"prop1": "p1",
"prop2": [
1,
"str2",
{
"p1": "p1inner",
"p2": null,
"p3": null,
"p4date": "Tue Jun 11 2019 18:47:50 GMT+0530 (India Standard Time)"
}
]
}
Note p4date is string not Date object but format and timezone are completely preserved.
*/
2009-09-28T10:00:00Z
tidak mewakili saat yang sama dalam waktu sebagaiMon Sep 28 10:00:00 UTC+0200 2009
. TanggalZ
dalam ISO 8601 berarti UTC, dan jam 10 di UTC adalah momen waktu yang berbeda dengan jam 10 di +0200. Menginginkan tanggal untuk diserialkan dengan zona waktu yang tepat adalah satu hal, tetapi Anda meminta kami membantu Anda membuat serialisasi ke representasi yang benar-benar salah secara obyektif .