Hier ist etwas wirklich Ordentliches und Einfaches (zumindest glaube ich das :)) und erfordert keine Manipulation des Datums, um geklont zu werden oder eine der nativen Funktionen des Browsers wie toJSON zu überladen (Referenz: Wie JSON ein Javascript-Datum stringifiziert und die Zeitzone beibehält, höflicher Shawson)
Übergeben Sie eine Ersetzungsfunktion an JSON.stringify, die Dinge nach Herzenslust anordnet !!! Auf diese Weise müssen Sie keine Stunden- und Minutenunterschiede oder andere Manipulationen vornehmen.
Ich habe in console.logs Zwischenergebnisse eingefügt, damit klar ist, was los ist und wie die Rekursion funktioniert. Das zeigt etwas Bemerkenswertes: Der Wertparameter für den Ersatz ist bereits in das ISO-Datumsformat konvertiert :). Verwenden Sie diese [Taste], um mit Originaldaten zu arbeiten.
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
repräsentiert nicht den gleichen Zeitpunkt wieMon Sep 28 10:00:00 UTC+0200 2009
. Das DatumZ
in ISO 8601 bedeutet UTC, und 10 Uhr in UTC ist ein anderer Zeitpunkt als 10 Uhr in +0200. Es wäre eine Sache, wenn das Datum mit der richtigen Zeitzone serialisiert werden soll, aber Sie bitten uns, Ihnen bei der Serialisierung zu einer Darstellung zu helfen, die eindeutig und objektiv falsch ist .