Come clonare un oggetto Date?


498

L'assegnazione di una Datevariabile a un'altra copierà il riferimento nella stessa istanza. Ciò significa che cambiando l'uno cambierà l'altro.

Come posso effettivamente clonare o copiare Dateun'istanza?

Risposte:


739

Utilizzare il metodo dell'oggetto DategetTime() , che restituisce il numero di millisecondi dal 1 ° gennaio 1970 alle 00:00:00 ( ora di epoca ):

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

In Safari 4 puoi anche scrivere:

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

... ma non sono sicuro che funzioni in altri browser. (Sembra funzionare in IE8).


9
JSON per questo frammento? Sembra che queste persone dovrebbero chiarire le loro basi ... Come scambiare jQuery per JavaScript DOM.
Boldewyn,

17
Un altro modo di scrivere questa bella soluzione sarebbe estendere il prototipo Date: Date.prototype.clone = function() { return new Date(this.getTime()); }; che potresti usare comecopiedDate = date.clone();
Ryan

6
L' copiedDate = new Date(date)approccio funziona in IE6 +. In Firefox le due opzioni hanno la stessa velocità.
Ryan,

14
new Date(date)lo stesso new Date(date.getTime()), perché JS proverà a chiamare date.valueOf()quando ha bisogno di un numero, ed date.valueOf()è uguale a date.getTime(), riferimento Date.valueOf Object.valueOf
Steely Wing

10
Non utilizzare new Date(date), utilizzare new Date(date.getTime()o new Date(date.valueOf)invece poiché il primo modo può portare a differenze tra le date almeno in Firefox e IE (non Chrome). Ad esempio l'utilizzo di toISOString()entrambe le date in Firefox genera "2015-04-21T04:56:42.000Z"e "2015-04-21T04:56:42.337Z".
crudh,

115

Questo è l'approccio più pulito

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

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


9
Il metodo "valueOf ()" per gli oggetti "Date" produce lo stesso risultato del metodo "getTime ()" (il numero di millisecondi dal tempo di epoca).
Steve Harrison,

35
@Steve: true, ma getTime () potrebbe "sembrare" come se restituisse solo l'ora e non includesse anche la data, quindi il mio riferimento a "cleanest". Francamente il tipo di data in Javascript è un po 'una zona di disastro, non avrebbe mai dovuto essere mutevole in primo luogo.
AnthonyWJones,

1
@AnthonyWJones: Giusto, capisco cosa intendi.
Steve Harrison,

3
Sono d'accordo che .valueOf () è più chiaro. A volte mi dimentico e uso .getMilliseconds () b / c per me che suona come significa millisecondi dal tempo di epoca.
Tom Wayson,

1
+1 a Steve Harrison: mi chiedevo se fosse così, grazie per il chiarimento.
Brian Lacy,


14

Versione semplificata:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}

72
non farai casino con gli oggetti incorporati
Pawel,

3
Non farai casino con oggetti che non possiedi. Dovresti fare una nuova copia e chiamarla SuperDate o qualcosa del genere, con il tuo ambito. Molti problemi difficili da testare sono causati dalla funzionalità degli oggetti che cambia inaspettatamente.
Ray Foss,

Funzionerebbe, ma per motivi di manutenibilità, questo approccio verrebbe considerato come un odore di codice. Ho scritto un approccio che di solito uso nella mia codifica: actuts.wordpress.com/2017/01/10/…
Allan Chua

1
Inoltre, non vedo questa necessità per provare ad aggiungere metodi agli incorporati in primo luogo. Studia la programmazione funzionale e scopri perché una buona funzione vecchio stile è in realtà molto più potente dei metodi sull'oggetto stesso. E 'anche più brevi: const cloneDate = d => new Date(d.getTime()).
Stijn de Witt,

6

Ho scoperto che questo semplice compito funziona anche:

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

Ma non so quanto sia "sicuro". Testato con successo in IE7 e Chrome 19.


9
Non utilizzare new Date(date), utilizzare new Date(date.getTime()o new Date(date.valueOf)invece poiché il primo modo può portare a differenze tra le date almeno in Firefox e IE (non Chrome). Ad esempio l'utilizzo di toISOString()entrambe le date in Firefox genera "2015-04-21T04:56:42.000Z"e "2015-04-21T04:56:42.337Z".
crudh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.