2012-09-26 97 views
19

我使用moment.js 1.7.0來嘗試和比較今天的日期與其他日期,但diff功能說,他們爲1相隔一天的某些原因。moment.js diff的不正確

代碼

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

控制檯

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

想法?

+0

我已經1.7.0,我測試你的代碼,我得到'DIFF:0' - 你肯定沒有在您的moment.js改變? – rationalboss

+0

我認爲這是與時區或UTC /本地。如果我登錄releaseDate'的'了'.hours()'和'now'它產生不同的結果對我來說。如果我使用'var now = moment()。sod()'[(docs)](http://momentjs.com/docs/#/manipulating/sod/)它現在按預期工作,但我不確定我是多麼信任。 – manafire

回答

44

基礎上documentation(和簡短的測試),moment.js創建日期周圍物體的包裝。聲明:

var now = moment(); 

創造了一個「瞬間」的對象,在其心臟有由new Date()彷彿創建的,那麼小時,分鐘和秒將被設置爲當前時間一個新的Date對象。

聲明:

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

創建,在它的心臟有一個新的Date對象彷彿new Date(2012, 8, 25)其中,小時,分鐘和秒將所有本地時區設置爲零創建的時刻的對象。

moment.diff返回一個基於四捨五入兩個日期之間的差異毫秒數值。要查看完整的值,通過true作爲第三個參數:

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

所以在運行代碼時,這將取決於每天的時間和本地時區now.diff(releaseDate, 'days')是否是0或1,即使運行相同的當地日期。

如果你想比較有日期,然後使用:

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

將時間設定爲00:00:00在本地時區。

+0

謝謝你的解釋!使用'moment()。sod()'消除了我的四捨五入問題,使用你提到的第三個參數進行了測試。 – manafire

+2

請注意,只有在使用'startOf('day')'時,'sod'才能運行到版本2。 – RobG

2

RobG的回答對於這個問題是正確的,所以這個答案只適用於那些正在搜索如何比較時間js中的日期的人。

我嘗試使用STARTOF( '天'),像上面提到:

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

這對我沒有工作。

我不得不用isSame

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