Đây là một cái gì đó thực sự gọn gàng và đơn giản (ít nhất tôi tin là như vậy :)) và không yêu cầu thao tác ngày tháng để được sao chép hoặc làm quá tải bất kỳ hàm gốc nào của trình duyệt như toJSON (tham khảo: Cách JSON xâu chuỗi ngày javascript và bảo toàn múi giờ , bạn Shawson tán tỉnh)
Chuyển một hàm thay thế cho JSON.stringify để xâu chuỗi nội dung trái tim của bạn !!! Bằng cách này, bạn không phải thực hiện chênh lệch giờ và phút hoặc bất kỳ thao tác nào khác.
Tôi đã đưa vào console.logs để xem kết quả trung gian để có thể hiểu rõ điều gì đang xảy ra và cách đệ quy hoạt động. Điều đó cho thấy một điều đáng chú ý: giá trị tham số thay thế đã được chuyển đổi sang định dạng ngày ISO :). Sử dụng [phím] này để làm việc với dữ liệu gốc.
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
không đại diện cho cùng một thời điểm trong thời gian nhưMon Sep 28 10:00:00 UTC+0200 2009
. NgàyZ
trong ISO 8601 có nghĩa là UTC và 10 giờ ở UTC là thời điểm khác với 10 giờ ở +0200. Sẽ là một điều nếu bạn muốn ngày được tuần tự với múi giờ phù hợp, nhưng bạn đang yêu cầu chúng tôi giúp bạn tuần tự hóa nó thành một đại diện sai rõ ràng, khách quan .