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?

Árvíztűrő tükörfúrógép
la source

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

Steve Harrison
la source
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);

AnthonyWJones
la source
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
26
var orig = new Date();
var copy = new Date(+orig);
Dave
la source
3
J'aime le mieux cette solution.
A1rPun
3
Très précis et propre :)
robinmitra
33
Sauf que vous devrez expliquer ce que cette magie +fait à quiconque sauf aux experts JS.
Stijn de Witt
8
:) +signe est opérateur unaray ici. Ça veut dire new Date( Number(orig)) . Plus ici: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Leonard Lepadatu
14

Version simplifiée:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}
Berezh
la source
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.

LK
la source
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