Comment cloner un objet Date?


498

L'affectation d'une Datevariable à une autre copiera la référence dans la même instance. Cela signifie que changer l'un changera l'autre.

Comment puis-je réellement cloner ou copier une Dateinstance?

Réponses:


739

Utilisez la méthode de l'objet DategetTime() , qui renvoie le nombre de millisecondes depuis le 1er janvier 1970 00:00:00 ( heure de l'époque ):

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

Dans Safari 4, vous pouvez également écrire:

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

... mais je ne sais pas si cela fonctionne dans d'autres navigateurs. (Il semble fonctionner dans IE8).


9
JSON pour cet extrait? On dirait que ces personnes devraient clarifier leurs bases ... Comme confondre jQuery avec JavaScript DOM.
Boldewyn

17
Une autre façon d'écrire cette belle solution serait d'étendre le prototype Date: que Date.prototype.clone = function() { return new Date(this.getTime()); }; vous pourriez ensuite utiliser en tant quecopiedDate = date.clone();
Ryan

6
L' copiedDate = new Date(date)approche fonctionne dans IE6 +. Dans Firefox, les deux options ont la même vitesse.
Ryan

14
new Date(date)Identique à new Date(date.getTime()), car JS tentera d'appeler date.valueOf()lorsqu'il a besoin d'un numéro, et date.valueOf()est identique à date.getTime(), référence Date.valueOf Object.valueOf
Steely Wing

10
N'utilisez pas new Date(date), utilisez new Date(date.getTime()ou à la new Date(date.valueOf)place, car la première façon peut entraîner des différences entre les dates dans au moins Firefox et IE (pas Chrome). Par exemple, l'utilisation toISOString()des deux dates dans Firefox génère "2015-04-21T04:56:42.000Z"et "2015-04-21T04:56:42.337Z".
crudh

115

C'est l'approche la plus propre

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

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


9
La méthode "valueOf ()" pour les objets "Date" produit le même résultat que sa méthode "getTime ()" (le nombre de millisecondes depuis l'époque).
Steve Harrison

35
@Steve: vrai, mais getTime () pourrait "ressembler" à ce qu'il ne renvoie que l'heure et ne pas inclure la date aussi, d'où ma référence à "la plus propre". Franchement, le type Date dans Javascript est un peu une zone sinistrée, il n'aurait jamais dû être mutable en premier lieu.
AnthonyWJones

1
@AnthonyWJones: D'accord, je vois ce que tu veux dire.
Steve Harrison

3
Je suis d'accord que .valueOf () est plus clair. Parfois, j'oublie et utilise .getMilliseconds () b / c pour moi qui sonne comme si cela signifiait des millisecondes moyennes depuis l'époque.
Tom Wayson

1
+1 à Steve Harrison: Je me demandais si c'était le cas, merci pour la clarification.
Brian Lacy


14

Version simplifiée:

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

72
tu ne joueras pas avec les objets intégrés
Pawel

3
Tu ne joueras pas avec des objets que tu ne possèdes pas. Vous devez faire une nouvelle copie et l'appeler SuperDate ou quelque chose, en fonction de votre portée. Beaucoup de difficultés à tester les bogues sont causées par une modification inattendue des fonctionnalités de l'objet.
Ray Foss

Cela fonctionnerait, mais pour des raisons de maintenabilité, cette approche serait considérée comme une odeur de code. J'ai écrit une approche que j'utilise habituellement dans mon codage: actuts.wordpress.com/2017/01/10/…
Allan Chua

1
De plus, je ne vois pas ce besoin d'essayer d'ajouter des méthodes aux intégrés en premier lieu. Étudiez la programmation fonctionnelle et découvrez pourquoi une bonne fonction à l'ancienne est en réalité beaucoup plus puissante que les méthodes sur l'objet lui-même. Il est également plus courte: const cloneDate = d => new Date(d.getTime()).
Stijn de Witt

6

J'ai découvert que cette simple mission fonctionne également:

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

Mais je ne sais pas à quel point c'est "sûr". Testé avec succès dans IE7 et Chrome 19.


9
N'utilisez pas new Date(date), utilisez new Date(date.getTime()ou à la new Date(date.valueOf)place, car la première façon peut entraîner des différences entre les dates dans au moins Firefox et IE (pas Chrome). Par exemple, l'utilisation toISOString()des deux dates dans Firefox génère "2015-04-21T04:56:42.000Z"et "2015-04-21T04:56:42.337Z".
crudh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.