Moment JS - Überprüfen Sie, ob ein Datum heute oder in der Zukunft liegt


222

Ich versuche zu momentjsüberprüfen, ob ein bestimmtes Datum heute oder in der Zukunft liegt.

Das habe ich bisher:

<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript">

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment().diff(SpecialTo) > 0) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

</script>

Der Code wertet mein Datum (31. Januar 2014) als Datum in der Vergangenheit aus.

Irgendeine Idee, was ich falsch mache?

Antworten:


197

Nachdem Sie die Dokumentation gelesen haben: http://momentjs.com/docs/#/displaying/difference/ , müssen Sie die diffFunktion als Minusoperator betrachten.

                   // today < future (31/01/2014)
today.diff(future) // today - future < 0
future.diff(today) // future - today > 0

Daher müssen Sie Ihren Zustand umkehren .

Wenn Sie überprüfen möchten, ob alles in Ordnung ist, können Sie der Funktion einen zusätzlichen Parameter hinzufügen:

moment().diff(SpecialTo, 'days') // -8 (days)

75
Dies wird nicht funktionieren, wenn es ein anderer Tag ist, aber der Unterschied ist weniger als 24 Stunden
Galki

1
Arbeiten, unabhängig davon, ob der Zeitunterschied weniger als 24 Stunden beträgt.
Zanderwar

3
Ich arbeite nicht für mich. Wenn der Tag im zukünftigen Moment +1 ist (). Diff (SpecialTo, 'Tage') gibt mir -0 (negative Null)
Gavroche

2
Heute heißt nicht in den nächsten 24 Stunden. isSame ist eine gute Lösung.
Kasper Ziemianek

1
moment().diff(SpecialToDate)gibt direkt den Unterschied in Millisekunden an. 'days'wird nicht gebraucht. Dies funktioniert für alle Szenarien. SpecialToDate kann '2018-10-26 00:00:00'ein Beispiel sein.
BackslashN

312

Sie können die isSameFunktion verwenden:

var iscurrentDate = startTime.isSame(new Date(), "day");
if(iscurrentDate) {

}

passt das auch zu Jahr und Monat?
SuperUberDuper

13
Es muss Jahr und Monat übereinstimmen. Moment ('2010-01-01'). isSame ('2011-01-01', 'Monat'); // falscher, anderer Jahresmoment ('2010-01-01'). isSame ('2010-02-01', 'Tag'); // falscher, anderer Monat
Gray Wolf

6
Dies beantwortet nicht einmal die Frage des OP ... "heute ODER IN DER ZUKUNFT", und was ist das startTime? isSame
Datumsobjekt

1
@ Sharcoux Diese Frage handelt von momentjs, also ist es eindeutig ein Momentobjekt.
Nathan

157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');

85

Da es noch niemand erwähnt zu haben scheint, ist der einfachste Weg zu überprüfen, ob ein Moment-Datumsobjekt in der Vergangenheit liegt:

momentObj.isBefore()

Oder in der Zukunft:

momentObj.isAfter()

Lassen Sie einfach die Argumente leer - das wird jetzt standardmäßig sein.

Es gibt auch isSameOrAfterund isSameOrBefore.

NB dies berücksichtigt die Zeit. Wenn Sie sich nur für den Tag interessieren , lesen Sie die Antwort von Dipendu .


1
Die Dokumente erklären, dass dies undefiniertes Verhalten ist, daher sollten Sie dies nicht tun: momentjs.com/docs/#/query/is-before
Dancrumb

13
@Dancrumb Lies es noch einmal. "Wenn nichts an den Moment # isBefore übergeben wird, wird standardmäßig die aktuelle Zeit verwendet." Das momentObjin meinem Beispiel ist eine Instanz eines Momentdatums. In den Dokumenten geht es speziell darum, eine neue Instanz (aktuelle Zeit) zu erstellen und dann in einer Anweisung zu überprüfen, ob sie in der Vergangenheit liegt. Ich schlage nicht vor, dass Sie dies tun, moment().isBefore()was völlig sinnlos ist - warum sollten Sie prüfen, ob das Jetzt in der Vergangenheit (oder Zukunft) liegt?
Mpen

83

Sie können die isAfter()Abfragefunktion von momentjs verwenden:

Überprüfen Sie, ob ein Moment nach einem anderen Moment liegt.

moment('2010-10-20').isAfter('2010-10-19'); // true

Wenn Sie die Granularität auf eine andere Einheit als Millisekunden beschränken möchten, übergeben Sie die Einheiten als zweiten Parameter.

moment('2010-10-20').isAfter('2010-01-01', 'year'); // false

moment('2010-10-20').isAfter('2009-12-31', 'year'); // true

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


Der Konstruktor, der eine Datumszeichenfolge verwendet, ist veraltet.
Vahid Amiri

@VahidAmiri Die Dokumente erwähnen dies nicht. Sie schlagen jedoch vor, dass wir den String + Format- Konstruktor verwenden, wenn wir ISO 8601 nicht verwenden . Wenn man also keine seltsamen Datumsformate verwendet, ist es in Ordnung, nur eine Zeichenfolge zu verwenden.
Johndodo

15

invert isBefore Methode des Augenblicks, um zu überprüfen, ob ein Datum wie heute oder in Zukunft wie folgt ist:

!moment(yourDate).isBefore(moment(), "day");

10

Nur für den Fall, dass jemand anderes dies benötigt, tun Sie dies einfach:

const isToday = moment(0, "HH").diff(date, "days") == 0;

oder wenn Sie eine Funktion wünschen:

isToday = date => moment(0,"HH").diff(date, "days") == 0;

Wo Datum ist das Datum, nach dem Sie suchen möchten.

Erläuterung

moment(0, "HH") kehrt heute um Mitternacht zurück.

date1.diff(date2, "days") Gibt die Anzahl der Tage zwischen Datum1 und Datum2 zurück.

Aktualisieren

Ich habe seitdem die Funktion isSame gefunden , die meiner Meinung nach die richtige Funktion ist, um herauszufinden, ob ein Datum heute ist:

moment().isSame('2010-02-01', 'day'); // Return true if we are the 2010-02-01

8

Um zu überprüfen, ob es heute ist :

Wenn wir zwei Daten vergleichen, die auch die Zeitinformationen enthalten, isSameschlagen diese offensichtlich fehl. diffschlägt fehl, falls sich die beiden Daten über den neuen Tag erstrecken:

var date1 = moment("01.01.2016 23:59:00", "DD.MM.YYYY HH.mm.ss");
var date2 = moment("02.01.2016 00:01:00", "DD.MM.YYYY HH.mm.ss");
var diff = date2.diff(date1); // 2seconds

Ich denke, der beste Weg, auch wenn er nicht schnell und kurz ist, ist der folgende:

var isSame = date1.date() == date2.date() && date1.month() == date2.month() && date1.year() == date2.year()

Um zu überprüfen, ob es in der Zukunft liegt :

Wie auch von anderen Benutzern vorgeschlagen, difffunktioniert die Methode.

var isFuture = now.diff(anotherDate) < 0 

7

Wenn Sie nur wissen müssen, welches größer ist, können Sie sie auch direkt vergleichen:

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment() > SpecialTo) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

Hoffe das hilft!


4

Wenn firstDate gleich oder nach (zukünftigem) secondDate ist , wird true zurückgegeben. Andernfalls wird false zurückgegeben. Toda ist firstDate = new Date ();

  static isFirstDateSameOrAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isSameOrBefore(date2,'day');
    }
    return false;
  }

Es gibt isSame, isBefore und isAfter für den Tag.

  static isFirstDateSameSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if (date1 && date2) {
      return date1.isSame(date2,'day');
    }
    return false;
  }

  static isFirstDateAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isAfter(date2,'day');
    }
    return false;
  }

  static isFirstDateBeforeSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isBefore(date2,'day');
    }
    return false;
  }

3

Verwenden Sie die einfachste, um das zukünftige Datum zu überprüfen

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");

2
function isTodayOrFuture(date){
  date = stripTime(date);
  return date.diff(stripTime(moment.now())) >= 0;
}

function stripTime(date){
  date = moment(date);
  date.hours(0);
  date.minutes(0);
  date.seconds(0);
  date.milliseconds(0);
  return date;
}

Und dann benutze es einfach so:

isTodayOrFuture(YOUR_TEST_DATE_HERE)

1

Wählen Sie gestern, um vergangene Tage zu überprüfen oder nicht mit Hilfe von moment().subtract(1, "day");

Referenz: - http://momentjs.com/docs/#/manipulating/subtract/

function myFunction() {
  var yesterday = moment().subtract(1, "day").format("YYYY-MM-DD");
  var SpecialToDate = document.getElementById("theDate").value;

  if (moment(SpecialToDate, "YYYY-MM-DD", true).isAfter(yesterday)) {
    alert("date is today or in future");
    console.log("date is today or in future");
  } else {
    alert("date is in the past");
    console.log("date is in the past");
  }
}
<script src="http://momentjs.com/downloads/moment.js"></script>
<input type="date" id="theDate" onchange="myFunction()">


1

Wenn wir einen Unterschied ohne Uhrzeit wünschen, können Sie das Datum anders (nur Datum ohne Uhrzeit) wie unten unter Verwendung des Momentformats erhalten.

Als ich dabei mit dem Unterschied konfrontiert war;

moment().diff([YOUR DATE])

Also kam mit folgenden zu kommen;

const dateValidate = moment(moment().format('YYYY-MM-DD')).diff(moment([YOUR SELECTED DATE HERE]).format('YYYY-MM-DD'))

IF dateValidate > 0 
   //it's past day
else
   //it's current or future

Bitte zögern Sie nicht zu kommentieren, wenn es etwas zu verbessern gibt.

Vielen Dank,


3
Bitte überprüfen Sie, wie Sie eine gute Antwort schreiben . Von Nur-Code-Antworten wird abgeraten, da sie nicht erklären, wie sie das Problem lösen. Sie sollten Ihre Antwort aktualisieren, um zu erklären, was dies bewirkt und wie sich die vielen Antworten, die diese Frage bereits hat, verbessern .
FluffyKitten

0

Ich wollte es für etwas anderes, fand aber schließlich einen Trick, den Sie versuchen können

somedate.calendar(compareDate, { sameDay: '[Today]'})=='Today'

var d = moment();
 var today = moment();
 
 console.log("Usign today's date, is Date is Today? ",d.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
 var someRondomDate = moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Usign Some Random Date, is Today ?",someRondomDate.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
  
 var anotherRandomDate =  moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Two Random Date are same date ? ",someRondomDate.calendar(anotherRandomDate, {
    sameDay: '[Today]'})=='Today');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


0

Überprüfen Sie mit folgenden:

let isContinue = moment().diff('2020-04-04T20:06:11+05:30')/1000

es kehrt in Sekunden zurück ..

Wenn wird als 2 Minuten Zustand dann überprüfen

if (isContinue < 120) {
  ..To check otp details or further logic
} else {
   // otp is getting invalid
}

0

Die einfachste Antwort lautet:

const firstDate = moment('2020/10/14'); // the date to be checked
const secondDate = moment('2020/10/15'); // the date to be checked

firstDate.startOf('day').diff(secondDate.startOf('day'), 'days'); // result = -1
secondDate.startOf('day').diff(firstDate.startOf('day'), 'days'); // result = 1

Es wird mit dem Mitternachtswert überprüft und ein genaues Ergebnis zurückgegeben. Es funktioniert auch, wenn der Zeitunterschied zwischen zwei Daten weniger als 24 Stunden beträgt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.