web-dev-qa-db-ja.com

今日の日付を別の日付と比較すると、間違った日付が返されます。なぜですか?

私は moment.js 1.7.0を使用して今日の日付を別の日付と比較しようとしていますが、diff関数が何らかの理由で1日離れていると言っています。

コード

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 

アイデア?

27
manafire

documentation (および簡単なテスト)に基づいて、moment.jsは日付オブジェクトのラッパーを作成します。ステートメント:

_var now = moment();
_

new Date()のように作成された新しいDateオブジェクトを中心に持つ「モーメント」オブジェクトを作成するため、時間、分、秒が現在の時刻に設定されます。

ステートメント:

_var releaseDate = moment("2012-09-25");
_

new Date(2012, 8, 25)のように作成された新しいDateオブジェクトを中心に持つモーメントオブジェクトを作成します。この場合、ローカルタイムゾーンの時間、分、秒はすべてゼロに設定されます。

_moment.diff_は、2つの日付間のミリ秒単位の丸め差に基づいて値を返します。完全な値を表示するには、3番目のパラメーターとしてtrueを渡します。

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

そのため、同じローカル日付で実行された場合でも、コードが実行される時刻とnow.diff(releaseDate, 'days')がゼロか1かどうかのローカルタイムゾーンに依存します。

日付だけを比較したい場合は、次を使用します。

_var now = moment().startOf('day'); 
_

これにより、ローカルタイムゾーンで時刻が00:00:00に設定されます。

55
RobG

RobGの答えは質問に対して正しいので、この答えはmomentjsで日付を比較する方法を検索する人のためのものです。

上記のようにstartOf( 'day')を使用しようとしました:

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

これは私にはうまくいきませんでした。

私は isSame を使わなければなりませんでした:

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