モーメントjs日時比較


384

日付時刻をフォーマットするためにmoment.jsを使用しています。ここには2つの日付値があり、一方の日付が他方の日付より大きい場合に特定の機能を実現したいと考えています。私は彼らのドキュメントのほとんどを読みましたが、これを達成するための機能が見つかりませんでした。私はそれがそこにあることを知っています。

これは私のコードです:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

編集する

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

ここでは、2つの日付を比較2014-03-24T01:15:000 > 2014-03-24T01:14:000しています。つまり、最初の日付が2番目の日付より大きいことを期待していますが、常にelse条件になります。なぜだかわかりませんか?

回答:


540

私は、あなたが探していると信じてクエリ機能isBeforeisSame、とisAfter

しかし、何を試みているのか正確に伝えるのは少し難しいです。おそらく、入力時間と現在の時間の差を求めているだけですか?もしそうなら、考える差関数をdiff。例えば:

moment().diff(date_time, 'minutes')

他のいくつかのこと:

  • 最初の行にエラーがあります:

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    それはうまくいきません。私はあなたが意味したと思います:

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    もちろん、次のこともできます。

    var date_time = '2013-03-24T10:15:20:12Z';
  • 使用しています:.tz('UTC')間違っています。 moment-timezoneに.tz属しています。のような他のタイムゾーンで作業しているのでない限り、これを使用する必要はありません。America/Los_Angeles

    値をUTCとして解析する場合は、次を使用します。

    moment.utc(theStringToParse)

    または、ローカル値を解析してUTCに変換する場合は、次を使用します。

    moment(theStringToParse).utc()

    または、おそらくそれはまったく必要ありません。入力値がUTCであるからといって、関数全体でUTCで作業する必要があるわけではありません。

  • によって「今」のインスタンスを取得しているようです moment(new Date())。代わりにを使用できますmoment()

更新しました

あなたの編集に基づいて、私はあなたがこれを行うことができると思います:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

または、フィールドが正しい形式であることが検証されていることを確認したい場合:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');

1
貴重なコメントありがとうございます。私はあなたのコメントを含むようにコードを編集しましたが、違いが正しくわかりません。編集したコードをチェックしてください
Dibish

3
更新された回答を参照してください。秒フィールドの桁数にも注意してください。そして、req.body.timezoneこれ以外に何かありZますか?もしそうなら、何ですか?
Matt Johnson-Pint 2014年

編集したコードに感謝します。ほとんど到達しました。私の場合、ユーザー側からタイムゾーン番号を取得しています。たとえば、moment(date_time)を使用すると、date_time = 2014-03-25T23:10 + 5:30になります。 .utc()無効な日付が表示されることがあります
Dibish

1
+05:30とすると、うまくいきます。もう一度、親切にありがとうございました
Dibish

.isSame()はまさに私が探していたものです。以前のドキュメントではどういうわけかそれを逃しました。
2015年

231

それらを直接比較できるはずです。

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}


87
これが機能することを説明する価値があると思います。JavaScriptがオブジェクトをプリミティブに強制変換するのObject.prototype.valueOfは、プロトタイプの瞬間にオーバーライドされ、エポックタイムスタンプを数値として返すからです。したがって、これはに似ていnow.format('x') > date.format('x')ます。
tandrewnichols 2017

いいえ、機能していません...これが私が試したものです。// newDateが現在の日付よりも高い...したがって、より大きい条件と低い条件の両方で印刷が失敗するconst resDate = res.url.expiryDate; const newDate = moment(resDate); var now = moment()。format( "DD / MM / YYYY"); if(now <newDate){console.log( "success"); } else {console.log( "fail")}
スティーブ

3
@steve moment().format("DD/MM/YYYY")は文字列を返し、アルファベット順に比較すると、12月1日は1日の前に来るため、あなたも日数で先行しています。format()瞬間オブジェクトを直接比較したい場合は使用しないでください。
ryanwinchester

28

Jsfiddle:http ://jsfiddle.net/guhokemk/1/

 function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

dateTimeAがdateTimeBより大きい場合、メソッドは1を返します

dateTimeAがdateTimeBと等しい場合、メソッドは0を返します

dateTimeAがdateTimeBより小さい場合、メソッドは-1を返します


1
function compare1(dateTimeA、dateTimeB){return moment(dateTimeA、 'MM / DD / YYYY')。diff(dateTimeB、 'MM / DD / YYYY'); }
Shamseer 2017

23

あなたの日時が正しいであることが重要であるISO形式のいずれかの使用している場合momentjsクエリをisBeforeisAfterisSameOrBeforeisSameOrAfterisBetween

したがって、2014-03-24T01:14:000の代わりに、日時は次のいずれかになります。

2014-03-24T01:14:00または2014-03-24T01:14:00.000Z

そうしないと、次の非推奨の警告が表示され、条件がfalseと評価されます。

非推奨の警告:提供された値は、認識されているRFC2822またはISO形式ではありません。モーメントの構築はjs Date()にフォールバックします。これは、すべてのブラウザーとバージョンで信頼できるわけではありません。RFC2822 / ISO以外の日付形式は推奨されておらず、次のメジャーリリースで削除される予定です。詳細については、http://momentjs.com/guides/#/warnings/js-date/を参照して ください

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>


10

このような瞬間に日付を渡すと、比較して結果が得られます。フォーマットが不要な場合は削除してください

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be carefulこれは2つの文字列を比較することに他なりません
Pranoy Sarkar

@PranoySarkarなぜもっと注意する必要があるのか​​教えてください。
DEEPESH KUMAR R


2

日時の比較にvalueOfは、日時のミリ秒を提供する瞬間の関数を使用できます。これは比較に最適です。

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>


1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.