2011-07-07 24 views
12
var date1 = new Date(); 
date1.setFullYear(2011, 6, 1); 

// 2011-07-01, ok 
console.log(date1); 

// set date2 the same date as date1 
var date2 = date1; 

// ... 

// now I'm gonna set a new date for date2 
date2.setFullYear(2011, 9, 8); 

// 2011-10-08, ok 
console.log(date2); 

// 2011-10-08, wrong, expecting 2011-07-01 
// I didn't assign a new date to date1 
// WHY is date1 changed? 
console.log(date1); 
+1

Hình dạng của nó giống như 'date2' đang được thiết lập như một con trỏ tới những gì' date1' đang trỏ đến. – James

Trả lời

19

ngày là đối tượng, vì vậy nó được gán như tài liệu tham khảo - phương pháp đơn giản là

date2 = new Date(date1); 
+0

nhận được nó, Cảm ơn SergeS và những người trợ giúp sau đây – railOne

+1

Biến thể câu trả lời của SergeS, nhưng đối tượng Date() trong js ép buộc thành số, vì vậy bạn không cần getTime(): – yzorg

+0

Trên nhận xét, 'getTime()' là không cần thiết –

1

Cả hai biến ngày chỉ là tài liệu tham khảo cho các đối tượng cùng một ngày trong bộ nhớ. Vì vậy, bạn cần date2 là một bản sao của date1. Thay đổi:

var date2 = date1; 

này:

var date2 = new Date(date1.getTime()); 
0

Bạn cần phải tạo một bản sao của date1, hiện date1date2 tham khảo các đối tượng cùng ngày.

var date2 = new Date(date1.valueOf()); 
1

JavaScript sử dụng vượt qua bằng cách tham khảo cho những ngày * (cũng như tất cả các phi nguyên thủy -. var o = {}; var j = o; j.foo = 1; console.log(o.foo); //1 Mặt khác, đối với Numbers, Strings, và Booleans var o = 0; var j = o; j++; console.log(j); // 0), do đó dự kiến ​​hành vi.

Nếu bạn cần phải sao chép một ngày bạn luôn có thể

var date2 = new Date(date1.getTime()); 

* Xin vui lòng xem ý kiến ​​để hiểu tại sao điều này là không hoàn toàn chính xác.

+1

Nó không thực sự vượt qua bằng cách tham chiếu. Nó truyền theo giá trị trong đó giá trị là tham chiếu. Nếu nó được chuyển qua tham chiếu, việc thay đổi tham chiếu sẽ thay đổi đối tượng: 'a = {}; b = a; b = null; 'Trong một pass bởi mô hình đánh giá tham chiếu,' a === null' phải là true, vì 'b' * là *' a' và chúng ta đặt 'b' thành' null'. – davin

+0

@davin Đó là sự tinh tế mà tôi chưa biết. – cwallenpoole

+0

Bỏ phiếu. Rất hữu ích. Tuy nhiên, một chi tiết. Nếu 'date2' đã được cấp phát, thì không cần sử dụng' new'. Việc gán sẽ được thực hiện bởi: 'date2.setTime (date1.valueOf());'. – Karl

1

date2 Đó là tham chiếu đến date1.

Để đạt được kết quả mong đợi, làm như sau:

var date1 = new Date(); 
date1.setFullYear(2011, 6, 1); 

var date2 = new Date(); 
date2.setTime(date1.valueOf()); 
0

Biến thể của @ câu trả lời SergeS, nhưng Date() đối tượng trong js ép buộc đến số, do đó bạn không cần getTime():

// general case 
var dateValueCopy = new Date(date1); 

Và trình bày lại với OP tên biến:

var date2 = new Date(date1); 
+0

Để hiển thị đối tượng ngày trùng với số cố gắng: (ngày mới() * 1) – yzorg

0
<html lang="en"> 
<head> 
<script> 
function getDateDiff(time1, time2) { 
var str1= time1.split('/'); 
var str2= time2.split('/'); 
var t1 = new Date(str1[2], str1[0]-1, str1[1]); 
var t2 = new Date(str2[2], str2[0]-1, str2[1]); 

var diffMS = t1 - t2;  
console.log(diffMS + ' ms'); 

var diffS = diffMS/1000;  
console.log(diffS + ' '); 

var diffM = diffS/60; 
console.log(diffM + ' minutes'); 

var diffH = diffM/60; 
console.log(diffH + ' hours'); 

var diffD = diffH/24; 
console.log(diffD + ' days'); 
alert(diffD); 
} 

//alert(getDateDiff('10/18/2013','10/14/2013')); 
</script> 
</head> 
<body> 
<input type="button" onclick="getDateDiff('10/18/2013','10/14/2013')" value="clickHere()" /> 
</body> 
</html>