Ось щось справді охайне і просте (принаймні, я так вважаю :)) і не вимагає клонування дати, щоб клонувати або перевантажувати будь-яку з власних функцій браузера, наприклад toJSON (довідка: Як JSON розшифрувати дату JavaScript і зберегти часовий пояс , залицяння Шоусон)
Передайте функцію заміни в JSON.stringify, яка розшифровує речі до душі !!! Таким чином, вам не доведеться робити різниці в годину і хвилину або будь-які інші маніпуляції.
Я помістив console.logs, щоб побачити проміжні результати, щоб було зрозуміло, що відбувається і як працює рекурсія. Це виявляє щось гідне уваги: параметр значення для заміни вже перетворений у формат дати ISO :). Використовуйте цю [клавішу] для роботи з вихідними даними.
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
не представляє того самого моменту в часі, що іMon Sep 28 10:00:00 UTC+0200 2009
. ДатаZ
в ISO 8601 означає UTC, а 10 годин за UTC - це інший момент часу до 10 години за +0200. Одне було б бажати, щоб дата була серіалізована з правильним часовим поясом, але ви просите нас допомогти вам серіалізувати її до подання, яке є однозначно, об’єктивно неправильним .