日付オブジェクトを複製する方法は?


498

Date変数を別の変数に割り当てると、参照が同じインスタンスにコピーされます。つまり、一方を変更すると、もう一方も変更されます。

実際にDateインスタンスを複製またはコピーするにはどうすればよいですか?

回答:


739

1970年1月1日00:00:00(エポック時間)以降のミリ秒数を返すDateオブジェクトのgetTime()メソッドを使用します。

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 2009

17
この素晴らしいソリューションを作成するもう1つの方法は、Dateプロトタイプを拡張するDate.prototype.clone = function() { return new Date(this.getTime()); }; ことです。 これは、次のように使用できますcopiedDate = date.clone();
Ryan

6
このcopiedDate = new Date(date)アプローチはIE6 +で機能します。Firefoxでは、2つのオプションは同じ速度です。
ライアン

14
new Date(date)同じようにnew Date(date.getTime())、JSは、呼び出そうとしますのでdate.valueOf()、それは数を必要とするとき、およびdate.valueOf()同じであるdate.getTime()、参照Date.valueOf Object.valueOf
スティーリー・ウィング

10
使用しないでくださいnew Date(date)、使用しnew Date(date.getTime()たりnew Date(date.valueOf)最初の方法は、少なくともFirefoxとIE(ないクローム)での日付の間の違いにつながることができますので、代わりに。たとえばtoISOString()、Firefoxで両方の日付を使用する"2015-04-21T04:56:42.000Z"と、およびが生成され"2015-04-21T04:56:42.337Z"ます。
crudh 2015

115

これは最もクリーンなアプローチです

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

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


9
「Date」オブジェクトの「valueOf()」メソッドは、「getTime()」メソッドと同じ結果(エポック時間からのミリ秒数)を生成します。
スティーブハリソン

35
@Steve:trueですが、getTime()は、時刻のみを返し、日付も含まないように「見える」可能性があるため、私の「最もクリーンな」への参照を参照します。率直に言って、JavascriptのDate型は少し災害ゾーンであり、そもそも変更可能であるべきではありませんでした。
AnthonyWJones 2009

1
@AnthonyWJones:そうです、私はあなたの意味を理解しています。
スティーブハリソン

3
.valueOf()がより明確であることに同意します。時々私は.getMilliseconds()b / cを忘れて使用します。これはエポックタイムからの平均ミリ秒を意味するように聞こえます。
トムウェイソン、2012年

1
スティーブ・ハリソンへの+1:明確にしてくれてありがとう。
ブライアンレイシー、2013

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

3
私はこのソリューションが一番好きです。
A1rPun 2014

3
非常に正確でクリーン:)
robinmitra '26

33
ただし+、JSのエキスパート以外には、その魔法が何をしているかを説明する必要があります。
Stijn de Witt

8
:) +記号はここではunray演算子です。という意味new Date( Number(orig)) です。もっとここに:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
レナードLepadatu

14

簡略版:

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

72
ビルトインオブジェクトを台無しにしないでください
Pawel

3
あなたは自分の所有物ではない物をいじってはならない。新しいコピーを作成し、それをSuperDateまたはなんらかの名前で、スコープを指定してください。バグをテストするのが難しいのは、オブジェクトの機能が予期せず変更されたためです。
Ray Foss

これは機能しますが、保守性の理由から、このアプローチはコードのにおいと見なされます。:私は私のコーディングで、私は通常、使用することをアプローチを書かれている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(ないクローム)での日付の間の違いにつながることができますので、代わりに。たとえばtoISOString()、Firefoxで両方の日付を使用する"2015-04-21T04:56:42.000Z"と、およびが生成され"2015-04-21T04:56:42.337Z"ます。
crudh 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.