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?

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).


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);


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


14

Versi sederhana:

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.