2012-09-26 37 views
19

Używam moment.js 1.7.0, aby spróbować porównać dzisiejszą datę z inną datą, ale funkcja diff mówi, że z pewnego powodu dzieli ją 1 dzień. Kodmoment.js diff niepoprawny

:

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')); 

konsola:

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

Pomysły?

+0

mam 1.7.0, i przetestowany kod i mam 'Diff: 0' - są na pewno nic się nie zmieniło w swoich moment.js? – rationalboss

+0

Myślę, że ma to coś wspólnego z strefami czasowymi lub utc/local. Jeśli loguję '.hours()' z 'releaseDate' i' now' to daje to dla mnie inne wyniki. Jeśli używam 'var now = moment(). Sod()' [(docs)] (http://momentjs.com/docs/#/manipulating/sod/) to obecnie działa zgodnie z oczekiwaniami, ale nie jestem pewien jak bardzo ufam temu. – manafire

Odpowiedz

44

podstawie documentation (i krótkim testowania), moment.js tworzy obwoluty wokół aktualnych obiektów. Oświadczenie:

var now = moment(); 

tworzy „moment” obiekt, który w jego serce ma nowy obiekt Date stworzony jakby new Date(), więc godziny, minuty i sekundy zostanie ustawiona na chwili obecnej.

Oświadczenie:

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

tworzy chwilę obiekt, który w swoim sercu ma nowy obiekt Date stworzony jakby new Date(2012, 8, 25) gdzie godziny, minuty i sekundy wszystko będzie ustawiony na zero dla lokalnej strefy czasowej .

moment.diff zwraca wartość na podstawie tej zaokrąglone różnicę w ms między dwoma datami. Aby zobaczyć pełną wartość, przechodzą true jako trzeci parametr:

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

Więc to zależy od pory dnia, kiedy prowadzony jest kod i lokalnej strefy czasowej czy now.diff(releaseDate, 'days') wynosi zero lub jeden, nawet gdy działają na ta sama lokalna data.

Jeśli chcesz porównać tylko daty, a następnie użyć:

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

który ustawi czas do 00:00:00 w lokalnej strefie czasowej.

+0

Dziękuję za wyjaśnienie! Użycie 'moment(). Sod()' eliminuje mój problem zaokrąglania, co zostało przetestowane przy użyciu trzeciego wspomnianego parametru. – manafire

+2

Zauważ, że 'sod' działa tylko do wersji 2, kiedy będziesz musiał użyć' startOf ('day') '. – RobG

2

odpowiedź RobG jest prawidłowy na pytanie, więc odpowiedź jest tylko dla tych, którzy szukają sposobu, aby porównać daty momentjs.

I próbował użyć startOf ('dzień'), jak wspomniano powyżej:

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

To nie dla mnie.

musiałem użyć isSame:

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