646 votes

Comment cloner un objet Date ?

Attribution d'un Date vers une autre variable copiera la référence à la même instance. Cela signifie qu'en modifiant l'une, on modifie l'autre.

Comment puis-je réellement cloner ou copier un Date instance ?

954voto

Steve Harrison Points 31062

Utiliser le Date de l'objet getTime() qui renvoie le nombre de millisecondes depuis le 1er janvier 1970 00:00:00 UTC ( 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 suis pas sûr que cela fonctionne dans d'autres navigateurs. (Cela semble fonctionner dans IE8).

1 votes

Parfois, les gens utilisent aussi la sérialisation et la désérialisation JSON, mais celle-ci est meilleure et beaucoup plus rapide. +1 de ma part.

9 votes

JSON pour cet extrait ? Il semblerait que ces personnes devraient clarifier leurs bases... Comme confondre jQuery avec JavaScript DOM.

22 votes

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

158voto

AnthonyWJones Points 122520

C'est l'approche la plus propre

let date = new Date() 
let copyOfDate = new Date(date.valueOf())

console.log(date);
console.log(copyOfDate);

11 votes

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'heure d'origine).

48 votes

@Steve : c'est vrai, mais getTime() pourrait "sembler" ne renvoyer que l'heure et ne pas inclure la date également, d'où ma référence à "plus propre". Franchement, le type Date en Javascript est un peu une zone de désastre, il n'aurait jamais dû être mutable en premier lieu.

1 votes

@AnthonyWJones : Je vois ce que vous voulez dire.

38voto

Dave Points 21
var orig = new Date();
var copy = new Date(+orig);

console.log(orig, copy);

3 votes

C'est cette solution qui me plaît le plus.

4 votes

Très précis et propre :)

45 votes

Sauf qu'il faudra expliquer ce qu'est cette magie + ne fait à personne d'autre qu'aux experts de la JS.

15voto

Berezh Points 181

Version simplifiée :

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

94 votes

Tu ne toucheras pas aux objets intégrés

4 votes

Tu ne dois pas toucher aux objets qui ne t'appartiennent pas. Vous devriez faire une nouvelle copie et l'appeler SuperDate ou quelque chose comme ça, dans les limites de votre champ d'action. De nombreux bogues difficiles à tester sont dus à des changements inattendus de la fonctionnalité des objets.

0 votes

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/

9voto

L K Points 51

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

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

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

10 votes

Ne pas utiliser new Date(date) , utiliser new Date(date.getTime() ou new Date(date.valueOf) car la première méthode peut entraîner des différences entre les dates au moins dans Firefox et IE (mais pas dans Chrome). Par exemple, en utilisant toISOString() sur les deux dates dans Firefox génère "2015-04-21T04:56:42.000Z" y "2015-04-21T04:56:42.337Z" .

3 votes

C'était peut-être le cas avec les anciennes versions de Firefox, mais pas avec la dernière version, new Date(date) fonctionne bien. Essayez-le : let date = '2015-04-21T04:56:42.337Z'; new Date(date).toISOString() . Le résultat est identique à l'entrée : "2015-04-21T04:56:42.337Z"

1 votes

Pour tous ceux qui lisent ces lignes aujourd'hui, c'est travaux Veuillez ignorer les anciens commentaires indiquant que .getTime doit être utilisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X