如何克隆一个Date对象?


498

Date变量分配给另一个变量会将引用复制到同一实例。这意味着更改一个将更改另一个。

我实际上如何克隆或复制Date实例?

Answers:


737

使用Date对象的getTime()方法,该方法返回自1970年1月1日00:00:00(纪元时间)以来的毫秒数:

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

在Safari 4中,您还可以编写:

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

...但是我不确定这是否可以在其他浏览器中使用。(它似乎在IE8中有效)。


9
此代码段的JSON吗?听起来这些人应该弄清楚他们的基础知识...就像将jQuery误认为JavaScript DOM。
Boldewyn

17
编写此解决方案的另一种方法是扩展Date原型: Date.prototype.clone = function() { return new Date(this.getTime()); }; 然后可以将其用作copiedDate = date.clone();
Ryan 2010年

6
copiedDate = new Date(date)方法在IE6 +中有效。在Firefox中,两个选项的速度相同。
瑞安2010年

14
new Date(date)与相同new Date(date.getTime()),因为JS date.valueOf()在需要数字时会尝试调用,并且与date.valueOf()相同date.getTime(),请参考Date.valueOf Object.valueOf
Steely Wing

10
请勿使用new Date(date),使用new Date(date.getTime()new Date(date.valueOf)代替,因为第一种方法可能导致至少Firefox和IE(不是Chrome)中的日期之间存在差异。例如toISOString(),在Firefox中两个日期同时使用会生成"2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z"
crudh 2015年

114

这是最干净的方法

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

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


9
“日期”对象的“ valueOf()”方法产生的结果与其“ getTime()”方法产生的结果相同(自历元时间起的毫秒数)。
史蒂夫·哈里森

34
@Steve:是的,但是getTime()可以“看起来”像它只返回时间,并且不包括日期,因此我引用“最干净”。坦白说,Javascript中的Date类型是个灾难区,一开始它永远都不应该是可变的。
AnthonyWJones

1
@AnthonyWJones:对,我明白你的意思。
史蒂夫·哈里森

3
我同意.valueOf()更清晰。有时我忘记了对我使用.getMilliseconds()b / c,听起来像是自纪元时间以来的平均毫秒数。
汤姆·韦森

1
+1对史蒂夫·哈里森(Steve Harrison):我想知道是否是如此,感谢您的澄清。
Brian Lacy 2012年


14

简化版:

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

72
您不可将内置对象弄乱
Pawel 2014年

3
您不可与自己不拥有的物体相混淆。您应该创建一个新副本,并随其范围将其命名为SuperDate或其他名称。许多难以测试的错误是由对象功能意外更改引起的。
雷·福斯

这是可行的,但是出于可维护性的原因,该方法将被视为代码气味。:我写了一个方法,我通常在我的编码使用actuts.wordpress.com/2017/01/10/...
艾伦蔡氏

1
另外,我也没有看到首先需要尝试向内置方法添加方法的需求。研究函数式编程,发现为什么好的老式函数实际上比对象本身的方法功能强大得多。这也是短:const cloneDate = d => new Date(d.getTime())
Stijn de Witt

6

我发现这个简单的赋值也可以工作:

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

但是我不知道它有多“安全”。已在IE7和Chrome 19中成功测试。


9
请勿使用new Date(date),使用new Date(date.getTime()new Date(date.valueOf)代替,因为第一种方法可能导致至少Firefox和IE(不是Chrome)中的日期之间存在差异。例如toISOString(),在Firefox中两个日期同时使用会生成"2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z"
crudh 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.