Làm thế nào để sao chép một đối tượng Date?


498

Việc gán một Datebiến cho một biến khác sẽ sao chép tham chiếu vào cùng một thể hiện. Điều này có nghĩa là thay đổi cái này sẽ thay đổi cái khác.

Làm thế nào tôi thực sự có thể sao chép hoặc sao chép một Dateví dụ?

Câu trả lời:


739

Sử dụng phương thức của đối tượng DategetTime() , trả về số mili giây kể từ ngày 1 tháng 1 năm 1970 00:00:00 ( thời gian kỷ nguyên ):

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

Trong Safari 4, bạn cũng có thể viết:

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

... nhưng tôi không chắc liệu điều này có hoạt động trong các trình duyệt khác không. (Nó dường như hoạt động trong IE8).


9
JSON cho đoạn trích này? Âm thanh như những người này sẽ làm rõ những điều cơ bản của họ ... Giống như nhầm lẫn jQuery với JavaScript DOM.
Boldewyn

17
Một cách khác để viết giải pháp tốt đẹp này là mở rộng nguyên mẫu Ngày: Sau Date.prototype.clone = function() { return new Date(this.getTime()); }; đó bạn có thể sử dụng nhưcopiedDate = date.clone();
Ryan

6
Cách copiedDate = new Date(date)tiếp cận hoạt động trong IE6 +. Trong Firefox hai tùy chọn có cùng tốc độ.
Ryan

14
new Date(date)tương tự new Date(date.getTime()), bởi vì JS sẽ cố gắng gọi date.valueOf()khi nó cần một số và date.valueOf()giống như date.getTime(), tham chiếu Date.valueOf Object.valueOf
Steely Wing

10
Không sử dụng new Date(date), sử dụng new Date(date.getTime()hoặc new Date(date.valueOf)thay vào đó vì cách đầu tiên có thể dẫn đến sự khác biệt giữa các ngày trong ít nhất Firefox và IE (không phải Chrome). Ví dụ: sử dụng toISOString()cả hai ngày trong Firefox tạo "2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z".
crudh

115

Đây là cách tiếp cận sạch nhất

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

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


9
Phương thức "valueOf ()" cho các đối tượng "Ngày" tạo ra kết quả tương tự như phương thức "getTime ()" của nó (số mili giây kể từ thời gian kỷ nguyên).
Steve Harrison

35
@Steve: đúng, nhưng getTime () có thể "trông" giống như nó chỉ trả về thời gian và không bao gồm ngày cũng như tham chiếu của tôi về "sạch nhất". Thành thật mà nói, loại ngày trong Javascript là một chút của khu vực thảm họa, nó không bao giờ có thể bị thay đổi ngay từ đầu.
AnthonyWJones

1
@AnthonyWJones: Phải, tôi hiểu ý của bạn.
Steve Harrison

3
Tôi đồng ý rằng .valueOf () rõ ràng hơn. Đôi khi tôi quên và sử dụng .getMilliseconds () b / c với tôi rằng âm thanh có nghĩa là mili giây kể từ thời gian kỷ nguyên.
Tom Wayon

1
+1 cho Steve Harrison: Tôi đã tự hỏi nếu đó là trường hợp, cảm ơn vì đã làm rõ.
Brian Lacy

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

3
Tôi thích giải pháp này tốt nhất.
A1rPun

3
Rất chính xác và sạch sẽ :)
robinmitra

33
Ngoại trừ bạn sẽ phải giải thích điều mà phép thuật đó +đang làm với bất kỳ ai trừ các chuyên gia về JS.
Stijn de Witt

8
:) +ký là nhà điều hành unaray ở đây. Nó có nghĩa là new Date( Number(orig)) . Xem thêm tại đây: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
mẹo

14

Phiên bản đơn giản hóa:

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

72
ngươi sẽ không gây rối với các vật thể tích hợp sẵn
Pawel

3
Ngươi chớ lộn xộn với đồ vật ngươi không sở hữu. Bạn nên tạo một bản sao mới và gọi nó là SuperDate hoặc một cái gì đó, với phạm vi của bạn. Rất nhiều khó khăn để kiểm tra lỗi là do chức năng đối tượng thay đổi bất ngờ.
Ray Foss

Điều này sẽ làm việc, nhưng vì lý do bảo trì, Cách tiếp cận này sẽ được coi là một mùi mã. Tôi đã viết một cách tiếp cận mà tôi thường sử dụng trong mã hóa của mình: actuts.wordpress.com/2017/01/10/ trên
Allan Chua

1
Ngoài ra, tôi không thấy nhu cầu này khi cố gắng thêm các phương thức vào phần dựng sẵn ở vị trí đầu tiên. Nghiên cứu lập trình chức năng và khám phá lý do tại sao một chức năng lỗi thời thực sự mạnh hơn nhiều so với các phương thức trên chính đối tượng. Nó cũng ngắn hơn : const cloneDate = d => new Date(d.getTime()).
Stijn de Witt

6

Tôi phát hiện ra rằng nhiệm vụ đơn giản này cũng hoạt động:

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

Nhưng tôi không biết nó "an toàn" đến mức nào. Đã thử nghiệm thành công trong IE7 và Chrome 19.


9
Không sử dụng new Date(date), sử dụng new Date(date.getTime()hoặc new Date(date.valueOf)thay vào đó vì cách đầu tiên có thể dẫn đến sự khác biệt giữa các ngày trong ít nhất Firefox và IE (không phải Chrome). Ví dụ: sử dụng toISOString()cả hai ngày trong Firefox tạo "2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z".
crudh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.