2012-09-26 15 views
19

Estoy usando moment.js 1.7.0 para tratar de comparar la fecha de hoy con otra fecha, pero la función diff dice que tienen un día de diferencia por algún motivo. códigomoment.js diff incorrecto

:

var releaseDate = moment("2012-09-25"); 
var now = moment(); //Today is 2012-09-25, same as releaseDate 
console.log("RELEASE: " + releaseDate.format("YYYY-MM-DD")); 
console.log("NOW: " + now.format("YYYY-MM-DD")); 
console.log("DIFF: " + now.diff(releaseDate, 'days')); 

consola:

RELEASE: 2012-09-25 
NOW: 2012-09-25 
DIFF: 1 

ideas?

+0

he 1.7.0, i probado su código y me dieron 'DIFF: 0' - ¿estás seguro de nada había cambiado en sus moment.js? – rationalboss

+0

Creo que es algo relacionado con las zonas horarias o utc/local. Si registro '.hours()' de 'releaseDate' y' now' arroja resultados diferentes para mí. Si uso 'var now = moment(). Sod()' [(docs)] (http://momentjs.com/docs/#/manipulating/sod/) funciona actualmente como se esperaba, pero no estoy seguro cuánto confío en eso. – manafire

Respuesta

44

Basado en el documentation (y pruebas breves), moment.js crea envoltorios alrededor de objetos de fecha. La declaración:

var now = moment(); 

crea un objeto "momento" que en su corazón tiene una nueva fecha objeto creado como por new Date(), por lo que las horas, minutos y segundos se establecerá en el momento actual.

La declaración:

var releaseDate = moment("2012-09-25"); 

crea un objeto momento que en su corazón tiene un nuevo objeto Date creado como por new Date(2012, 8, 25) donde las horas, minutos y segundos todos se ponen a cero para la zona horaria local .

moment.diff devuelve un valor basado en una la redondeado diferencia en ms entre las dos fechas. Para ver el valor total, pasan true como tercer parámetro:

now.diff(releaseDate, 'days', true) 
------------------------------^ 

Por lo tanto, dependerá de la hora del día cuando se ejecuta el código y la zona horaria local si now.diff(releaseDate, 'days') es cero o uno, incluso cuando se ejecuta en la misma fecha local.

Si desea comparar simplemente las fechas, a continuación, utilizar:

var now = moment().startOf('day'); 

que permitirá establecer el tiempo de 00:00:00 en la zona horaria local.

+0

¡Gracias por la explicación! El uso de 'moment(). Sod()' elimina mi problema de redondeo, como se prueba usando el tercer parámetro que mencionaste. – manafire

+2

Tenga en cuenta que 'sod' solo funcionará con la versión 2, cuando tendrá que usar' startOf ('day') '. – RobG

2

La respuesta de RobG es correcta para la pregunta, por lo que esta respuesta es solo para aquellos que buscan cómo comparar fechas en momentjs.

que intentó utilizar StartOf ('día'), como se mencionó anteriormente:

var compare = moment(dateA).startOf('day') === moment(dateB).startOf('day'); 

Esto no funcionó para mí.

tuve que usar isSame:

var compare = moment(dateA).isSame(dateB, 'day');