web-dev-qa-db-ja.com

瞬間jsの日付と時刻の比較

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

301
Dibish

クエリ関数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')を間違って使っています。 .tzmoment-timezone に属します。 America/Los_Angelesのように他のタイムゾーンで作業しているのでなければ、これを使う必要はありません。

    値をUTCとして解析したい場合は、次のようにします。

    moment.utc(theStringToParse)
    

    あるいは、ローカル値を解析して convert をUTCに変換したい場合は、次のようにします。

    moment(theStringToParse).utc()
    

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

  • moment(new Date())によって "now"インスタンスを取得しているようです。代わりに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');
432
Matt Johnson

あなたはそれらを直接比較することができるはずです。

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

if (now > date) {
   // date is past
} else {
   // date is future
}
$(document).ready(function() {
  
  $('.compare').click(function(e) {
  
    var date = $('#date').val();
  
    var now = moment();
    var then = moment(date);
  
    if (now > then) {
      $('.result').text('Date is past');
    } else {
      $('.result').text('Date is future');
    }

  });

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.3/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>



<input type="text" name="date" id="date" value="2014-12-18"  placeholder="yyyy-mm-dd">
<button class="compare">Compare date to current date</button>
<br>
<div class="result"></div>
181
ryanwinchester

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を返します。

15
Razan Paul

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

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

momentjs queriesisBeforeisAfter のいずれかを使用する場合は、datetimeが正しいISO形式であることが重要です。 isSameOrBeforeisSameOrAfterisBetween

そのため、2014-03-24T01:14:000の代わりに、datetimeは次のいずれかになります。

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

そうでなければ、次の非推奨警告を受け取る可能性があり、条件はfalseに評価されます。

非推奨警告:提供された値は、認識されているRFC 2822またはISO形式ではありません。モーメント構築はjs Date()に頼ります。これはすべてのブラウザとバージョンで信頼できるわけではありません。 RFC 2822/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>
9
JSON C11

私は、見積もりの​​開始日が現在の日付よりも短い場合にユーザーが取引履歴から見積もりを開いたとき、私はこれをしなければなりません。私は現在の日付を開始日として表示する必要がありました。

var startDate = "20/05/2018";

var date1 = moment().format("YYYY-MM-DD");
var date2 = moment(startDate).format("YYYY-MM-DD");

// and i checked with if statement 

if(date1 >  date2){   // if startDate is less than today
   startDate = date1;
}else{ // if startDate is greater than today

}

注:私にとっては、両方の日付を同じ形式に変換する必要があり、「YYYY-MM-DD」を使用しました。

7
KATJ Srinath
moment(d).isAfter(ahead30now); // true

http://momentjs.com/docs/#/query/is-after/

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

}
2
TV-C-15
        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;
        }
0
isaac