如何克隆一个Date对象?

IT技术 javascript
2021-01-19 04:21:28

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

我怎样才能真正克隆或复制一个Date实例?

6个回答

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

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

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

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

...但我不确定这是否适用于其他浏览器。(它似乎在 IE8 中工作)。

不要使用new Date(date), 使用new Date(date.getTime()ornew Date(date.valueOf)代替,因为第一种方法至少会导致 Firefox 和 IE(不是 Chrome)中的日期之间存在差异。例如toISOString(),在 Firefox 中的两个日期上使用都会生成"2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z"
2021-03-18 04:21:28
此代码段的 JSON?听起来这些人应该弄清楚他们的基础知识......就像将 jQuery 误认为 JavaScript DOM 一样。
2021-03-20 04:21:28
new Date(dateObject)正确的请参阅Date(value) 构造函数的说明,其中定义了日期对象的显式规则。在较旧的规范中,ToNumber如果参数不是字符串,则行为是调用参数,因此无论哪种方式,这都应该在任何正确实现该行为的浏览器中工作。
2021-04-02 04:21:28
编写这个不错的解决方案的另一种方法是扩展 Date 原型: Date.prototype.clone = function() { return new Date(this.getTime()); }; 然后您可以将其用作copiedDate = date.clone();
2021-04-03 04:21:28
new Date(date)与 相同new Date(date.getTime()),因为JS会date.valueOf()在需要数字时尝试调用,与date.valueOf()相同date.getTime(),参考Date.valueOf Object.valueOf
2021-04-08 04:21:28

这是最干净的方法

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

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

“Date”对象的“valueOf()”方法产生与其“getTime()”方法相同的结果(自纪元以来的毫秒数)。
2021-03-16 04:21:28
@AnthonyWJones:是的,我明白你的意思。
2021-03-16 04:21:28
我同意 .valueOf() 更清楚。有时我会忘记并使用 .getMilliseconds() b/c 对我来说这听起来像是自纪元时间以来的平均毫秒数。
2021-03-26 04:21:28
+1 给史蒂夫哈里森:我想知道是否是这样,感谢您的澄清。
2021-03-31 04:21:28
@Steve:是的,但 getTime() 可能“看起来”只返回时间而不包括日期,因此我提到了“最干净”。坦率地说,Javascript 中的 Date 类型有点像灾难区,它本来就不应该是可变的。
2021-04-10 04:21:28

var orig = new Date();
var copy = new Date(+orig);

console.log(orig, copy);

:)+符号在这里是 unaray 运算符。这意味着new Date( Number(orig)) 更多信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-20 04:21:28
我最喜欢这个解决方案。
2021-03-21 04:21:28
仅当orig不是字符串时才有效,例如2020-09-02T06:49:51.4000654Z
2021-04-05 04:21:28
非常精确和干净:)
2021-04-06 04:21:28
除非您必须向+JS 专家以外的任何人解释这种魔法的作用。
2021-04-10 04:21:28

简化版:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}
你不能弄乱内置对象
2021-03-20 04:21:28
这会起作用,但出于可维护性的原因,这种方法将被视为代码异味。我写了一个我经常在编码中使用的方法:actuts.wordpress.com/2017/01/10/...
2021-03-20 04:21:28
此外,我认为首先不需要尝试向内置函数添加方法。研究函数式编程并发现为什么一个好的老式函数实际上比对象本身的方法强大得多。它也更短:const cloneDate = d => new Date(d.getTime()).
2021-04-01 04:21:28
你不得弄乱你不拥有的物品。您应该制作一个新副本并在您的范围内将其称为 SuperDate 或其他名称。许多难以测试的错误都是由对象功能意外更改引起的。
2021-04-04 04:21:28

我发现这个简单的赋值也有效:

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

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

对于现在阅读本文的任何人来说,这是有效的,请忽略说明.getTime必须使用的旧评论
2021-03-13 04:21:28
不要使用new Date(date), 使用new Date(date.getTime()ornew Date(date.valueOf)代替,因为第一种方法至少会导致 Firefox 和 IE(不是 Chrome)中的日期之间存在差异。例如toISOString(),在 Firefox 中的两个日期上使用都会生成"2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z"
2021-03-26 04:21:28
这在旧版本的 Firefox 上可能是正确的,但在最新版本上,new Date(date)效果很好。试试看:let date = '2015-04-21T04:56:42.337Z'; new Date(date).toISOString()结果与输入相同:"2015-04-21T04:56:42.337Z"
2021-03-28 04:21:28