Assigning a Date variable to another one will copy the reference to the same instance. This means that changing one will change the other.
How can I actually clone or copy a Date instance?
Use the Date object's getTime() method, which returns the number of milliseconds since 1 January 1970 00:00:00 UTC (epoch time):
var date = new Date(); var copiedDate = new Date(date.getTime()); In Safari 4, you can also write:
var date = new Date(); var copiedDate = new Date(date); ...but I'm not sure whether this works in other browsers. (It seems to work in IE8).
Date.prototype.clone = function() { return new Date(this.getTime()); }; Which you could then use as copiedDate = date.clone();new Date(date) same as new Date(date.getTime()), because JS will try to call date.valueOf() when it need a number, and date.valueOf() is same as date.getTime(), reference Date.valueOf Object.valueOfnew Date(date), use new Date(date.getTime() or new Date(date.valueOf) instead since the first way can lead to differences between the dates in at least Firefox and IE (not Chrome). For example using toISOString() on the both dates in Firefox generates "2015-04-21T04:56:42.000Z" and "2015-04-21T04:56:42.337Z".new Date(dateObject) is correct. See description of Date(value) constructor where explicit rules for date object is defined. In the older specs the behavior was to call ToNumber on the argument if it wasn't a string so either way this should work in any browser that implements the behavior correctly.This is the cleanest approach
let date = new Date() let copyOfDate = new Date(date.valueOf()) console.log(date); console.log(copyOfDate); Update for 2021:
In one respect the notion of cloning a Date object sounds grander than it really is. As far as I can tell, there’s only one piece of instance data, and that is the stored time. What we’re really doing is making a new object with the same time.
Whatever may have been the case in the past, the new Date() constructor definitely accepts a Date object as a single argument:
const date = new Date(); // With or without an argument. const date2 = new Date(date); // Clone original date. The Specification at https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date at step 4(b) indicates that a Date object is definitely acceptable, and that this is equivalent to new Date(date.valueOf()), as suggested by some of the answers above. As I said, all you’re really doing is making a new Date object with the same time as the other.
You’ll also find that the documentation at https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date has been updated to include this.
var orig = new Date(); var copy = new Date(+orig); console.log(orig, copy); + is doing to anyone but JS experts.+ sign is unaray operator here. It means new Date( Number(orig)) . More here: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…orig is not a string such as 2020-09-02T06:49:51.4000654ZSimplified version:
Date.prototype.clone = function () { return new Date(this.getTime()); } const cloneDate = d => new Date(d.getTime()).I found out that this simple assignmnent also works:
dateOriginal = new Date(); cloneDate = new Date(dateOriginal); But I don't know how "safe" it is. Successfully tested in IE7 and Chrome 19.
new Date(date), use new Date(date.getTime() or new Date(date.valueOf) instead since the first way can lead to differences between the dates in at least Firefox and IE (not Chrome). For example using toISOString() on the both dates in Firefox generates "2015-04-21T04:56:42.000Z" and "2015-04-21T04:56:42.337Z".new Date(date) works fine. Try it: let date = '2015-04-21T04:56:42.337Z'; new Date(date).toISOString(). Result is the same as input: "2015-04-21T04:56:42.337Z".getTime must be used.For chrome it works:
//Thu Nov 03 2022 11:43:00 const date = new Date(2022,10,03,11,43,0); const date2 = new Date(date); now changing date2 will have no impact on the date