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

Parece que 'date2' se establece como un puntero a lo que apunta' date1'. – James

Respuesta

19

Fecha es objeto, por lo que se le asigna como referencia - enfoque simple es

date2 = new Date(date1); 
+0

lo tengo, gracias SergeS, y los siguientes ayudantes – railOne

+1

Variación de la respuesta de SergeS, pero los objetos Date() en js obligan al número, por lo que no necesita getTime(): – yzorg

+0

Arriba en el comentario, 'getTime()' es no es necesario –

1

Ambas variables de fecha son sólo referencias al mismo objeto fecha en la memoria. Entonces necesita date2 para ser un clon de date1. Cambio:

var date2 = date1; 

a esto:

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

Usted necesita crear una copia de date1, actualmente date1 y date2 se refieren al mismo objeto de fecha.

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

JavaScript utiliza pase por referencia de fechas * (así como todos los no-primitivas -. var o = {}; var j = o; j.foo = 1; console.log(o.foo); //1 Por otro lado, para los números, cadenas y booleanos var o = 0; var j = o; j++; console.log(j); // 0), por lo que es el comportamiento esperado.

Si tiene que copiar una fecha siempre se puede

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

* Por favor, vea los comentarios de entender por qué esto no es del todo correcto.

+1

No es realmente pasar por referencia. Pasa por valor donde el valor es la referencia. Si se pasara por referencia, cambiar la referencia cambiaría el objeto: 'a = {}; b = a; b = null; 'En un modelo de evaluación de pase por referencia,' a === null' debe ser verdadero, ya que 'b' * es *' a' y establecemos 'b' en' null'. – davin

+0

@davin Esa es una sutileza que no conocía. – cwallenpoole

+0

Hasta la votación. Muy útil. Un detalle sin embargo. Si 'date2' ya ha sido asignado, entonces no es necesario el uso de' new'. La asignación se llevaría a cabo mediante: 'date2.setTime (date1.valueOf());'. – Karl

1

date2 Es una referencia a date1.

para lograr los resultados esperados, haga lo siguiente:

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

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

Variación de @ respuesta de sargas, pero la fecha() objetos en js coaccionar a número, por lo que no es necesario getTime():

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

y se actualizan con la OP nombres de variables:

var date2 = new Date(date1); 
+0

Para mostrar la fecha en que los objetos fuerzan al número, pruebe: (new Date() * 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> 
Cuestiones relacionadas