2011-07-07 4 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

'date2', date1' işaretinin gösterdiği bir işaretçi olarak ayarlanıyor gibi görünüyor. – James

cevap

19

Tarih, nesnedir - basit yaklaşım

date2 = new Date(date1); 
+0

anladım, teşekkürler SergeS, ve aşağıdaki yardımcılar – railOne

+1

Değişim SergeS'nin cevabı, ama Date() nesneleri js olarak numaraya zorlamak, bu yüzden ihtiyacınız yok getTime(): – yzorg

+0

Yorumda, 'getTime()' gerekli değil –

1

Hem tarih değişkenleri bellekte aynı tarih nesnesine sadece referanslarıdır olduğunu. Bu nedenle klonu olmak için date2'a ihtiyacınız vardır. Değişim: Buna

var date2 = date1; 

:

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

Aynı tarih nesnesine başvurmak date1, şu anda date1 ve date2 bir kopyasını oluşturmak gerekir.

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

JavaScript Tarihler * için referans olarak geçmek kullanır (yanı sıra tüm sivil ilkel -. var o = {}; var j = o; j.foo = 1; console.log(o.foo); //1 Öte yandan, Sayılar, Yaylı ve Boolean var o = 0; var j = o; j++; console.log(j); // 0 için), bu beklenen bir davranıştır böylece. Eğer yapabilirsiniz kopyayı bir tarihi gerekiyorsa

hep

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

* Bu tamamen doğru değildir anlamak için yorum bakınız.

+1

Gerçekten referans olarak geçmiyor. Değerin referans olduğu değerden geçer. Referans ile geçilirse referansı değiştirmek nesneyi değiştirir: a = {}; b =; b = null; 'Referans değerlendirme modeline göre, a === null 'doğru olmalı, çünkü b' * * a 'dır ve biz' b' null' olarak ayarladık. – davin

+0

@davin Bu benim bilmediğim bir incelik. – cwallenpoole

+0

Yukarı oy. Çok yararlı. Ancak bir detay. Eğer date2' önceden tahsis edilmişse, 'new' kullanımına gerek yoktur. Atama şu şekilde gerçekleştirilir: 'date2.setTime (date1.valueOf());'. – Karl

1

date2date1 numaralı başvuru kaynağı. Eğer getTime() gerek kalmaz, js nesneleri) (

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

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

Varyasyon @ Serges en cevabın ancak tarihi numarasına zorlamak:

aşağıdakileri yapın beklenen sonuçlara ulaşmak için

// general case 
var dateValueCopy = new Date(date1); 
Ve OP ile yeniden düzenlenmiştir değişken isimleri:

var date2 = new Date(date1); 
+0

Tarih nesnelerini numaraya zorlamak için şunu deneyin: (yeni Tarih() * 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>