Atribuir uma Date
variável a outra copiará a referência para a mesma instância. Isso significa que mudar um mudará o outro.
Como posso realmente clonar ou copiar uma Date
instância?
Atribuir uma Date
variável a outra copiará a referência para a mesma instância. Isso significa que mudar um mudará o outro.
Como posso realmente clonar ou copiar uma Date
instância?
Respostas:
Use o método do objeto DategetTime()
, que retorna o número de milissegundos desde 1 de janeiro de 1970 00:00:00 ( horário da época ):
var date = new Date();
var copiedDate = new Date(date.getTime());
No Safari 4, você também pode escrever:
var date = new Date();
var copiedDate = new Date(date);
... mas não tenho certeza se isso funciona em outros navegadores. (Parece funcionar no IE8).
Date.prototype.clone = function() { return new Date(this.getTime()); };
O que você poderia então usar comocopiedDate = date.clone();
copiedDate = new Date(date)
abordagem funciona no IE6 +. No Firefox, as duas opções são da mesma velocidade.
new Date(date)
igual a new Date(date.getTime())
, porque o JS tentará ligar date.valueOf()
quando precisar de um número e date.valueOf()
é o mesmo que date.getTime()
, referência Date.valueOf Object.valueOf
new Date(date)
, use new Date(date.getTime()
ou, new Date(date.valueOf)
em vez disso, pois a primeira maneira pode levar a diferenças entre as datas no mínimo no Firefox e no IE (não no Chrome). Por exemplo, o uso toISOString()
nas duas datas no Firefox gera "2015-04-21T04:56:42.000Z"
e "2015-04-21T04:56:42.337Z"
.
Esta é a abordagem mais limpa
let dat = new Date()
let copyOf = new Date(dat.valueOf())
console.log(dat);
console.log(copyOf);
var orig = new Date();
var copy = new Date(+orig);
+
está fazendo com ninguém além de especialistas em JS.
+
sinal é operador unaray aqui. Isso significa new Date( Number(orig))
. Mais aqui: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Versão simplificada:
Date.prototype.clone = function () {
return new Date(this.getTime());
}
const cloneDate = d => new Date(d.getTime())
.
Descobri que esse simples trabalho também funciona:
dateOriginal = new Date();
cloneDate = new Date(dateOriginal);
Mas não sei o quão "seguro" é. Testado com sucesso no IE7 e Chrome 19.
new Date(date)
, use new Date(date.getTime()
ou, new Date(date.valueOf)
em vez disso, pois a primeira maneira pode levar a diferenças entre as datas no mínimo no Firefox e no IE (não no Chrome). Por exemplo, o uso toISOString()
nas duas datas no Firefox gera "2015-04-21T04:56:42.000Z"
e "2015-04-21T04:56:42.337Z"
.