Moment js Datum Zeit Vergleich

384

Ich verwende moment.js, um meine Datums- und Uhrzeitangabe zu formatieren. Hier habe ich zwei Datumswerte und möchte eine bestimmte Funktion erreichen, wenn ein Datum größer als das andere ist. Ich habe die meisten ihrer Dokumente gelesen, aber nicht die Funktion gefunden, um dies zu erreichen. Ich weiß, dass es dort sein 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, dh ich 2014-03-24T01:15:000 > 2014-03-24T01:14:000erwarte, dass das erste größer als das zweite ist, aber es geht immer zum anderen Zustand. Ich weiß nicht warum?

Dibish
quelle

Antworten:

540

Ich glaube , Sie für die Suche Abfragefunktionen , isBefore, isSame, und isAfter.

Aber es ist ein bisschen schwierig, genau zu sagen, was Sie versuchen. Vielleicht möchten Sie nur den Unterschied zwischen der Eingabezeit und der aktuellen Zeit ermitteln? Wenn ja, sollten Sie die Differenzfunktion , diff. Zum Beispiel:

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

Ein paar andere Dinge:

  • In der ersten Zeile ist ein Fehler aufgetreten:

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

    Das wird nicht funktionieren. Ich denke du meintest:

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

    Natürlich könnten Sie genauso gut:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Sie verwenden: .tz('UTC')falsch. .tzgehört zur Moment-Zeitzone . Sie müssen das nur verwenden, wenn Sie mit anderen Zeitzonen arbeiten, wie z America/Los_Angeles.

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

    moment.utc(theStringToParse)

    Wenn Sie einen lokalen Wert analysieren und in UTC konvertieren möchten , verwenden Sie:

    moment(theStringToParse).utc()

    Oder vielleicht brauchst du es gar nicht. Nur weil der Eingabewert in UTC angegeben ist, bedeutet dies nicht, dass Sie während Ihrer gesamten Funktion in UTC arbeiten müssen.

  • Sie scheinen die "Jetzt" -Instanz von zu bekommen moment(new Date()). Sie können stattdessen einfach verwenden moment().

Aktualisiert

Aufgrund Ihrer Bearbeitung können Sie dies einfach tun:

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 sind:

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');
Matt Johnson-Pint
quelle
1
Vielen Dank für Ihre wertvollen Kommentare. Ich habe meinen Code so bearbeitet, dass er Ihre Kommentare enthält, aber den Unterschied nicht richtig erfasst. Können Sie bitte meinen bearbeiteten Code überprüfen
Dibish
3
Siehe aktualisierte Antwort. Beobachten Sie auch die Anzahl der Ziffern im Sekundenfeld. Und ist req.body.timezonejemals etwas anderes als Z? Wenn ja, was?
Matt Johnson-Pint
Vielen Dank für Ihren bearbeiteten Code, ich bin fast dort angekommen. In meinem Fall habe ich diese Zeitzonennummer von der Benutzerseite, z. B. date_time = 2014-03-25T23: 10 + 5: 30, wenn ich moment (date_time) verwende. .utc () irgendwann habe ich ungültiges Datum bekommen
Dibish
1
Wenn ich +05: 30 setze, funktioniert es großartig. Nochmals vielen Dank für Ihre Freundlichkeit
Dibish
.isSame () ist genau das, wonach ich gesucht habe. Irgendwie habe ich es in den Dokumenten schon mal verpasst.
Will Strohl
231

Sie sollten sie direkt vergleichen können.

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

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

Ryanwinchester
quelle
87
Ich denke, es lohnt sich zu erklären, dass dies funktioniert, weil Javascript Objekte zu Grundelementen zwingt, über Object.prototype.valueOfdie im Moment der Prototyp überschrieben wird, um einen Epochenzeitstempel als Zahl zurückzugeben. Das ist also ähnlich wie now.format('x') > date.format('x').
Tandrewnichols
Nein, es funktioniert nicht ... hier ist, was ich versucht habe. // newDate ist höher als das aktuelle Datum ... daher schlagen Drucke sowohl unter größeren als auch unter geringeren Bedingungen fehl. const resDate = res.url.expiryDate; const newDate = moment (resDate); var now = moment (). format ("TT / MM / JJJJ"); if (now <newDate) {console.log ("Erfolg"); } else {console.log ("fail")}
Steve
3
@steve moment().format("DD/MM/YYYY")gibt eine Zeichenfolge zurück und dann vergleichen Sie alphabetisch und dann würde der 1. Dezember vor dem 2. Januar kommen, weil Sie auch mit Tagen führen. Nicht verwenden, format()wenn Sie die Momentobjekte direkt vergleichen möchten.
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"));

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

Razan Paul
quelle
1
Funktion compare1 (dateTimeA, dateTimeB) {Rückgabemoment (dateTimeA, 'MM / TT / JJJJ'). diff (dateTimeB, 'MM / TT / JJJJ'); }
Shamseer
23

Es ist wichtig , dass Ihr Datetime in dem richtigen ist ISO - Format , wenn eine der mit momentjs Abfragen : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Anstelle von 2014-03-24T01: 14: 000 sollte Ihre Datumszeit also entweder:

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

Andernfalls erhalten Sie möglicherweise die folgende Abwertungswarnung, und die Bedingung wird als falsch bewertet:

Verfallswarnung: Der angegebene Wert hat kein anerkanntes RFC2822- oder ISO-Format. Moment Konstruktion fällt auf js Date () zurück, was nicht für alle Browser und Versionen zuverlässig ist. Nicht-RFC2822 / ISO-Datumsformate werden nicht empfohlen und in einer kommenden Hauptversion entfernt. Weitere Informationen finden Sie unter 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>

JSON C11
quelle
10

Übergeben Sie das Datum auf einen solchen Moment, um es zu vergleichen und das Ergebnis zu erhalten. Wenn Sie das Format nicht möchten, entfernen Sie es

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")
Vijay Kumar
quelle
6
Be carefulDies ist nichts anderes als ein Vergleich von zwei Saiten
Pranoy Sarkar
@PranoySarkar Kannst du mir bitte sagen, warum wir vorsichtiger sein müssen?
DEEPESH KUMAR R
5
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 {

}
TV-C-15
quelle
2

Für den Vergleich von Datum und Uhrzeit können Sie die valueOfFunktion des Augenblicks verwenden, die Millisekunden der Datums- und Uhrzeitangabe liefert. Dies ist am besten für den Vergleich geeignet :

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>

Tyagi
quelle
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;
        }
isaac
quelle