Bagaimana cara mengkloning objek Date?

498

Menetapkan Datevariabel ke variabel lain akan menyalin referensi ke instance yang sama. Ini berarti bahwa mengubah yang satu akan mengubah yang lain.

Bagaimana saya bisa benar-benar mengkloning atau menyalin Datecontoh?

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

Jawaban:

739

Gunakan metode objek DategetTime() , yang mengembalikan jumlah milidetik sejak 1 Januari 1970 00:00:00 ( waktu zaman ):

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

Di Safari 4, Anda juga dapat menulis:

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

... tapi saya tidak yakin apakah ini berfungsi di browser lain. (Tampaknya berfungsi di IE8).

Steve Harrison
sumber
9
JSON untuk cuplikan ini? Kedengarannya orang-orang ini harus membersihkan dasar-dasarnya ... Seperti mengira jQuery untuk JavaScript DOM.
Boldewyn
17
Cara lain untuk menulis solusi yang bagus ini adalah dengan memperpanjang prototipe Date: Date.prototype.clone = function() { return new Date(this.getTime()); }; Yang kemudian bisa Anda gunakan sebagaicopiedDate = date.clone();
Ryan
6
The copiedDate = new Date(date)Pendekatan bekerja di IE6 +. Di Firefox, dua opsi memiliki kecepatan yang sama.
Ryan
14
new Date(date)sama dengan new Date(date.getTime()), karena JS akan mencoba menelepon date.valueOf()ketika memerlukan nomor, dan date.valueOf()sama dengan date.getTime(), referensi Date.valueOf Object.valueOf
Steely Wing
10
Jangan gunakan new Date(date), gunakan new Date(date.getTime()atau new Date(date.valueOf)sebaliknya karena cara pertama dapat menyebabkan perbedaan antara tanggal di setidaknya Firefox dan IE (bukan Chrome). Misalnya menggunakan toISOString()pada kedua tanggal di Firefox menghasilkan "2015-04-21T04:56:42.000Z"dan "2015-04-21T04:56:42.337Z".
crudh
115

Ini adalah pendekatan terbersih

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

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

AnthonyWJones
sumber
9
Metode "valueOf ()" untuk objek "Date" menghasilkan hasil yang sama dengan metode "getTime ()" (jumlah milidetik sejak zaman dahulu).
Steve Harrison
35
@Steve: true, tetapi getTime () bisa "terlihat" seperti itu hanya mengembalikan waktu dan tidak termasuk tanggal juga karenanya referensi saya ke "terbersih". Terus terang tipe tanggal dalam Javascript adalah sedikit zona bencana, seharusnya tidak pernah bisa berubah di tempat pertama.
AnthonyWJones
1
@AnthonyWJones: Benar, saya mengerti maksud Anda.
Steve Harrison
3
Saya setuju bahwa .valueOf () lebih jelas. Kadang-kadang saya lupa dan menggunakan .getMilliseconds () b / c bagi saya yang terdengar seperti itu berarti milidetik sejak zaman dulu.
Tom Wayson
1
+1 kepada Steve Harrison: Saya ingin tahu apakah itu masalahnya, terima kasih atas klarifikasi.
Brian Lacy
26
var orig = new Date();
var copy = new Date(+orig);
Dave
sumber
3
Saya suka solusi ini yang terbaik.
A1rPun
3
Sangat tepat dan bersih :)
robinmitra
33
Kecuali Anda harus menjelaskan apa yang dilakukan sihir +itu kepada siapa pun kecuali ahli JS.
Stijn de Witt
8
:) +tandanya operator unaray di sini. Artinya new Date( Number(orig)) . Lebih lanjut di sini: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Leonard Lepadatu
14

Versi sederhana:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}
Berezh
sumber
72
jangan mengacaukan objek
bawaan
3
Jangan mengacaukan benda yang tidak kamu miliki. Anda harus membuat salinan baru dan menyebutnya SuperDate atau apalah, dengan lingkup Anda. Banyak kesulitan untuk menguji bug yang disebabkan oleh perubahan fungsi objek secara tidak terduga.
Ray Foss
Ini akan berhasil, tetapi karena alasan pemeliharaan, pendekatan ini akan dianggap sebagai bau kode. Saya telah menulis pendekatan yang biasanya saya gunakan dalam pengkodean: actuts.wordpress.com/2017/01/10/…
Allan Chua
1
Saya juga tidak melihat perlunya mencoba menambahkan metode ke built-in. Pelajari pemrograman fungsional dan temukan mengapa fungsi kuno yang baik sebenarnya jauh lebih kuat daripada metode pada objek itu sendiri. Ini juga lebih pendek: const cloneDate = d => new Date(d.getTime()).
Stijn de Witt
6

Saya menemukan bahwa tugas sederhana ini juga berfungsi:

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

Tapi saya tidak tahu seberapa "aman" itu. Berhasil diuji di IE7 dan Chrome 19.

LK
sumber
9
Jangan gunakan new Date(date), gunakan new Date(date.getTime()atau new Date(date.valueOf)sebaliknya karena cara pertama dapat menyebabkan perbedaan antara tanggal di setidaknya Firefox dan IE (bukan Chrome). Misalnya menggunakan toISOString()pada kedua tanggal di Firefox menghasilkan "2015-04-21T04:56:42.000Z"dan "2015-04-21T04:56:42.337Z".
crudh