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.