web-dev-qa-db-ja.com

Moment.jsを使用した時間の比較

私は Moment.js で遊んでいて、問題に遭遇しました。私は、与えられた日付が過去か未来かを特定しようとしてきました。日付は nixタイムスタンプ として保存されます。したがって、将来の日付を現在の日付と比較する場合、問題なく機能しますが、過去の日付に対してトリガーされません。サンプルコードは以下のとおりです フィドルはここにあります

var pastUnixTime = '1348812970'; //some time in the past
var futureUnixTime = '1352350231';

if (moment.unix(futureUnixTime).format('DD MM YYYY') > moment().format('DD MM YYYY')) {
    console.log('yay');
}


if (moment.unix(pastUnixTime).format('DD MM YYYY') < moment().format('DD MM YYYY')) {
    console.log('yay 2');
}
​

上記のコードはyayをログに記録します。yay 2ではありません。なぜそれがyay 2をログに記録しないのか誰かが私に説明できますか?

17
Hirvesh

これには実際に.format()を使用する必要はありません。

まず、タイムスタンプは文字列ではなく数字である必要があります(例、_var pastUnixTime = 1348812970;_)。次に、タイムスタンプを直接比較できます。

_> pastUnixTime = 1348812970;
> pastUnixTime < moment().unix()
true
> pastUnixTime > moment().unix() 
false
_

さて、あなたのコードが失敗する理由は、_DD MM YYYY_文字列を比較するとき、それらが辞書式に比較されているからです…そして日は最初です!したがって、文字列_"01 01 2000"_は常に_"31 12 1900"_より「小さい」ことになります。 wantedで文字列を比較する場合は、_YYYY MM DD_形式を使用できます。そうすれば、_"2000 01 01"_は_"1900 12 31"_よりも正しく「大きく」なります。しかし、そうする理由はありません。タイムスタンプの方がはるかに簡単です。

最後に、注意:実際には.unix()を使用する必要はありません-moment()のインスタンスは賢明に比較されます。

_> past = moment().subtract("days", 1)
> now = moment()
> past < now
true
> past > now
false
_
36
David Wolever