Wie klone ich ein Date-Objekt?

498

Durch Zuweisen einer DateVariablen zu einer anderen wird der Verweis auf dieselbe Instanz kopiert. Dies bedeutet, dass das Ändern des einen das andere ändert.

Wie kann ich eine DateInstanz tatsächlich klonen oder kopieren ?

Árvíztűrő tükörfúrógép
quelle

Antworten:

739

Verwenden Sie die Methode des Date- Objekts getTime(), die die Anzahl der Millisekunden seit dem 1. Januar 1970 00:00:00 ( Epochenzeit ) zurückgibt :

var date = new Date();
var copiedDate = new Date(date.getTime());

In Safari 4 können Sie auch schreiben:

var date = new Date();
var copiedDate = new Date(date);

... aber ich bin mir nicht sicher, ob dies in anderen Browsern funktioniert. (Es scheint in IE8 zu funktionieren).

Steve Harrison
quelle
9
JSON für dieses Snippet? Klingt so, als ob diese Leute ihre Grundlagen klarstellen sollten ... Als würde man jQuery mit JavaScript DOM verwechseln.
Boldewyn
17
Eine andere Möglichkeit, diese nette Lösung zu schreiben, wäre, den Date-Prototyp zu erweitern: Den Date.prototype.clone = function() { return new Date(this.getTime()); }; Sie dann alscopiedDate = date.clone();
Ryan
6
Der copiedDate = new Date(date)Ansatz funktioniert in IE6 +. In Firefox haben beide Optionen die gleiche Geschwindigkeit.
Ryan
14
new Date(date)das gleiche wie new Date(date.getTime()), weil JS versuchen wird anzurufen, date.valueOf()wenn es eine Nummer benötigt, und date.valueOf()das gleiche ist wie die date.getTime()Referenz Date.valueOf Object.valueOf
Steely Wing
10
Nicht verwenden new Date(date), verwenden new Date(date.getTime()oder new Date(date.valueOf)stattdessen, da der erste Weg zu Unterschieden zwischen den Daten in mindestens Firefox und IE (nicht Chrome) führen kann. Wenn Sie beispielsweise toISOString()an beiden Daten in Firefox verwenden, werden "2015-04-21T04:56:42.000Z"und generiert "2015-04-21T04:56:42.337Z".
Crudh
115

Dies ist der sauberste Ansatz

let dat = new Date() 
let copyOf = new Date(dat.valueOf())

console.log(dat);
console.log(copyOf);

AnthonyWJones
quelle
9
Die Methode "valueOf ()" für "Date" -Objekte liefert das gleiche Ergebnis wie die Methode "getTime ()" (die Anzahl der Millisekunden seit der Epochenzeit).
Steve Harrison
35
@Steve: true, aber getTime () könnte "so aussehen", als würde es nur die Uhrzeit zurückgeben und nicht auch das Datum, daher mein Verweis auf "cleanest". Ehrlich gesagt ist der Datumstyp in Javascript eine Art Katastrophenzone, er hätte niemals veränderlich sein dürfen.
AnthonyWJones
1
@AnthonyWJones: Richtig, ich verstehe was du meinst.
Steve Harrison
3
Ich bin damit einverstanden, dass .valueOf () klarer ist. Manchmal vergesse ich .getMilliseconds () b / c und benutze es für mich, was so klingt, als würde es mittlere Millisekunden seit der Epoche bedeuten.
Tom Wayson
1
+1 an Steve Harrison: Ich habe mich gefragt, ob das der Fall ist, danke für die Klarstellung.
Brian Lacy
26
var orig = new Date();
var copy = new Date(+orig);
Dave
quelle
3
Diese Lösung gefällt mir am besten.
A1rPun
3
Sehr präzise und sauber :)
Robinmitra
33
Außer Sie müssen +jedem außer JS-Experten erklären, was diese Magie tut.
Stijn de Witt
8
:) +Zeichen ist unaray Betreiber hier. Es bedeutet new Date( Number(orig)) . Mehr hier: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Leonard Lepadatu
14

Vereinfachte Version:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}
Berezh
quelle
72
du sollst dich nicht mit eingebauten Gegenständen anlegen
Pawel
3
Du sollst dich nicht mit Gegenständen anlegen, die du nicht besitzt. Sie sollten eine neue Kopie erstellen und sie SuperDate oder so nennen, je nach Umfang. Viele schwer zu testende Fehler werden durch unerwartete Änderungen der Objektfunktionalität verursacht.
Ray Foss
Dies würde funktionieren, aber aus Gründen der Wartbarkeit würde dieser Ansatz als Codegeruch betrachtet. Ich habe einen Ansatz geschrieben, den ich normalerweise in meiner Codierung verwende: actuts.wordpress.com/2017/01/10/…
Allan Chua
1
Ich sehe auch nicht die Notwendigkeit, Methoden zu integrierten Funktionen hinzuzufügen. Studieren Sie die funktionale Programmierung und entdecken Sie, warum eine gute altmodische Funktion tatsächlich viel leistungsfähiger ist als Methoden für das Objekt selbst. Es ist auch kürzer : const cloneDate = d => new Date(d.getTime()).
Stijn de Witt
6

Ich fand heraus, dass diese einfache Zuweisung auch funktioniert:

dateOriginal = new Date();
cloneDate = new Date(dateOriginal);

Aber ich weiß nicht, wie "sicher" es ist. Erfolgreich in IE7 und Chrome 19 getestet.

LK
quelle
9
Nicht verwenden new Date(date), verwenden new Date(date.getTime()oder new Date(date.valueOf)stattdessen, da der erste Weg zu Unterschieden zwischen den Daten in mindestens Firefox und IE (nicht Chrome) führen kann. Wenn Sie beispielsweise toISOString()an beiden Daten in Firefox verwenden, werden "2015-04-21T04:56:42.000Z"und generiert "2015-04-21T04:56:42.337Z".
Crudh