18

私はMoment.jsをいじっていて、問題に遭遇しました。指定された日付が過去か未来かを特定しようとしています。日付はUnix タイムスタンプとして保存されます。したがって、将来の日付と現在の日付を比較すると、問題なく動作しますが、過去の日付に対してはトリガーされません。サンプル コードは以下にあり、フィドルは hereです。

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は not をログに記録しyay 2ます。なぜログに記録されないのか、誰かに説明してもらえますyay 2か?

4

1 に答える 1

38

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

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

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

さて、あなたのコードが失敗する理由は、DD MM YYYY文字列を比較すると、それらが辞書式に比較されているからです...そして、日が最初です! したがって、文字列"01 01 2000"は常に "less than" になり"31 12 1900"ます。文字列を比較したい場合は、 YYYY MM DDformat を使用できます — そうすれば、"2000 01 01"正しく "greater than" になり"1900 12 31"ます。しかし、そうする理由はありません - タイムスタンプはもっと簡単です。

.unix()最後に、注意: 実際には-を使用する必要はありませんmoment()

> past = moment().subtract("days", 1)
> now = moment()
> past < now
true
> past > now
false
于 2012-11-07T06:50:29.957 に答える