Como clonar um objeto Date?


498

Atribuir uma Datevariá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 Dateinstância?

Respostas:


739

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).


9
JSON para este snippet? Parece que essas pessoas devem esclarecer o básico ... Como confundir jQuery com JavaScript DOM.
— 7119 Boldewyn

17
Outra maneira de escrever esta solução agradável seria estender o protótipo Data: Date.prototype.clone = function() { return new Date(this.getTime()); }; O que você poderia então usar comocopiedDate = date.clone();
— Ryan

6
A copiedDate = new Date(date)abordagem funciona no IE6 +. No Firefox, as duas opções são da mesma velocidade.
— Ryan

14
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
— Steely Wing

10
Não use 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".
— crudh

115

Esta é a abordagem mais limpa

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

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


9
O método "valueOf ()" para objetos "Date" produz o mesmo resultado que o método "getTime ()" (o número de milissegundos desde o tempo da época).
— Steve Harrison

35
@ Steve: true, mas getTime () poderia "parecer", pois apenas retorna a hora e não inclui a data, portanto, minha referência a "mais limpa". Francamente, o tipo Data em Javascript é um pouco desastroso, nunca deveria ter sido mutável.
— 7119 AnthonyWJones

1
@AnthonyWJones: Certo, entendo o que você quer dizer.
— Steve Harrison

3
Concordo que .valueOf () é mais claro. Às vezes, esqueço e uso .getMilliseconds () b / c para mim que parece significar milissegundos desde o tempo da época.
— Tom Wayson

1
+1 para Steve Harrison: Eu queria saber se era esse o caso, obrigado pelo esclarecimento.
— Brian Lacy


14

Versão simplificada:

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

72
tu não mexerás com objetos embutidos
— Pawel

3
Não mexerás com objetos que não possuis. Você deve fazer uma nova cópia e chamá-la SuperDate ou algo assim, dentro do seu escopo. Muitos erros de teste são causados ​​pela alteração inesperada da funcionalidade do objeto.
— Ray Foss

Isso funcionaria, mas por motivos de manutenção, essa abordagem seria considerada um cheiro de código. Eu escrevi uma abordagem que eu costumo usar na minha codificação: actuts.wordpress.com/2017/01/10/…
— Allan Chua

1
Também não vejo essa necessidade de tentar adicionar métodos aos built-ins em primeiro lugar. Estude programação funcional e descubra por que uma boa função antiquada é realmente muito mais poderosa que os métodos no próprio objeto. É também mais curtos: const cloneDate = d => new Date(d.getTime()).
— Stijn de Witt

6

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.


9
Não use 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".
— crudh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.