Website-Suche

javascript - Moment js Datum Zeit Vergleich


Ich benutze moment.js, um mein Datum und meine Uhrzeit zu formatieren. Hier habe ich zwei Datumswerte, und ich möchte eine bestimmte Funktion ausführen, wenn ein Datum größer als das andere ist. Ich habe den größten Teil ihrer Dokumentation gelesen, aber die Funktion, um dies zu erreichen, nicht gefunden. Ich weiß, dass es sie geben wird.

Das ist mein Code:

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 {

}

Bearbeiten

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');
}

Hier vergleiche ich zwei Daten, d.h. 2014-03-24T01:15:000 > 2014-03-24T01:14:000, und erwarte, dass das erste größer ist als das zweite, aber es geht immer in die else-Bedingung. Ich weiß nicht warum?

Antwort #1

Ich glaube, Sie suchen nach den Abfragefunktionen isBefore, isSame und isAfter.

Aber es ist ein bisschen schwierig genau zu sagen, was Sie versuchen. Vielleicht möchten Sie nur die Differenz zwischen der Eingabezeit und der aktuellen Zeit erhalten? Wenn ja, ziehen Sie die Differenzfunktion diff in Betracht. Zum Beispiel:

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

Ein paar andere Dinge:

  • Es gibt einen Fehler in der ersten Zeile:

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

    Das wird nicht funktionieren. Ich glaube, du meintest:

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

    Natürlich könntest du genauso gut:

      var date_time = '2013-03-24T10:15:20:12Z';
    
  • Du verwendest: .tz('UTC') falsch. .tz gehört zu moment-timezone. Du musst es nicht verwenden, es sei denn, du arbeitest mit anderen Zeitzonen, wie America/Los_Angeles.

    Wenn Sie einen Wert als UTC analysieren möchten, verwenden Sie:

      moment.utc(theStringToParse)
    

    Oder, wenn Sie einen lokalen Wert analysieren und in UTC umwandeln möchten, dann verwenden Sie:

      moment(theStringToParse).utc()
    

    Oder vielleicht brauchst du es überhaupt nicht. Nur weil der Eingabewert in UTC ist, bedeutet das nicht, dass du in deiner gesamten Funktion in UTC arbeiten musst.

  • Es scheint, dass Sie die "jetzt"-Instanz mit moment(new Date()) erhalten. Sie können stattdessen einfach moment() verwenden.

Aktualisiert

Basierend auf deiner Bearbeitung denke ich, dass du einfach Folgendes tun kannst:

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

Oder, wenn Sie sicherstellen möchten, dass Ihre Felder im richtigen Format validiert werden:

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');

Antwort #2

Du solltest in der Lage sein, sie direkt zu vergleichen.

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>

Antwort #3

Es ist wichtig, dass Ihr Datum und Ihre Uhrzeit im richtigen ISO-Format vorliegen, wenn Sie eine der momentjs-Abfragen verwenden: isBefore, isAfter, isSameOrBefore, isSameOrAfter, isBetween

Also sollte Ihr Datum und Ihre Uhrzeit anstelle von 2014-03-24T01:14:000 entweder sein:

2014-03-24T01:14:00 oder 2014-03-24T01:14:00.000Z

Andernfalls erhalten Sie möglicherweise die folgende Veraltungswarnung und die Bedingung wird als falsch ausgewertet:

Abwertungswarnung: Der angegebene Wert liegt nicht in einem anerkannten RFC2822- oder ISO-Format vor. Die Moment-Erstellung greift auf js Date() zurück, was nicht in allen Browsern und Versionen zuverlässig ist. Nicht RFC2822/ISO-Datumsformate werden nicht empfohlen und werden in einer kommenden Hauptversion entfernt. Bitte schauen Sie unter http://momentjs.com/guides/#/warnings/js-date/ für weitere Informationen nach.

// 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>

Antwort #4

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"));

Die Methode gibt 1 zurück, wenn dateTimeA größer als dateTimeB ist

Die Methode gibt 0 zurück, wenn dateTimeA gleich dateTimeB ist

Die Methode gibt -1 zurück, wenn dateTimeA kleiner als dateTimeB ist

Antwort #5

Für den Datums-Zeit-Vergleich können Sie die valueOf-Funktion des Moments verwenden, die Millisekunden der Datums-Zeit liefert, was am besten für den Vergleich geeignet ist:

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

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

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

Antwort #6

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 {

}

Antwort #7

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;
}

Verwandte Artikel