Moment.js: Datum zwischen Daten

117

Ich versuche mit Moment.js festzustellen, ob ein bestimmtes Datum zwischen zwei Daten liegt. Seit Version 2.0.0 hat Tim hinzugefügt isBefore()und isAfter()zum Datumsvergleich.

Da es keine isBetween()Methode gibt, dachte ich, das würde funktionieren:

var date = moment("15/02/2013", "DD/MM/YYYY");
var startDate = moment("12/01/2013", "DD/MM/YYYY");
var endDate = moment("15/01/2013", "DD/MM/YYYY");

if (date.isBefore(endDate) && date.isAfter(startDate) || (date.isSame(startDate) || date.isSame(endDate)) ) { alert("Yay!"); } else { alert("Nay! :("); }

Ich bin überzeugt, dass es dafür einen besseren Weg geben muss. Irgendwelche Ideen?

Joel A. Villarreal Bertoldi
quelle
Ich bin zuversichtlich, dass Sie wollten ? isBetween || isStart || isEnd
Bergi
Ja, Tippfehler, sorry!
Joel A. Villarreal Bertoldi

Antworten:

82

Sie können eines der Moment-Plugins -> Moment-Range verwenden , um den Datumsbereich zu bearbeiten:

var startDate = new Date(2013, 1, 12)
  , endDate   = new Date(2013, 1, 15)
  , date  = new Date(2013, 2, 15)
  , range = moment().range(startDate, endDate);

range.contains(date); // false
Lukasz Koziara
quelle
1
Wie fügst du das Plugin ein?
2
Sie sollten nur <script src = "/ javascripts / moment-range.js"> </ script> nach momentjs einfügen
Lukasz Koziara
53
date.isBetween (startDate, endDate); ist viel einfacher und vermeidet die Notwendigkeit eines zusätzlichen Plugins.
Brendan Nee
moment & moment-Range bietet Optionen zum Formatieren der Datums- und Uhrzeitangabe beim Vorbereiten von Bereichen und zum Vergleichen der Datumsangaben für Contains / Within / Overlaps / Intersect / Add / Subtract. Wenn jemand Daten in einem speziellen Format abruft, kann er Datumsbereiche innerhalb des Arrays vorbereiten, indem er diese Daten in das erforderliche Format konvertiert, und dann können wir vergleichen.
Sajjad Ali Khan
274

In den Versionen 2.9+ gibt es eine isBetweenFunktion, die jedoch exklusiv ist:

var compareDate = moment("15/02/2013", "DD/MM/YYYY");
var startDate   = moment("12/01/2013", "DD/MM/YYYY");
var endDate     = moment("15/01/2013", "DD/MM/YYYY");

// omitting the optional third parameter, 'units'
compareDate.isBetween(startDate, endDate); //false in this case

Es gibt eine umfassende Problemumgehung ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... was logisch äquivalent zu ist
!(x.isBefore(a) || x.isAfter(b))


In Version 2.13 verfügt die isBetweenFunktion über einen vierten optionalen Parameter inclusivity.

Verwenden Sie es so:

target.isBetween(start, finish, 'days', '()') // default exclusive
target.isBetween(start, finish, 'days', '(]') // right inclusive
target.isBetween(start, finish, 'days', '[)') // left inclusive
target.isBetween(start, finish, 'days', '[]') // all inclusive

Weitere zu berücksichtigende Einheiten: years, months, days, hours, minutes, seconds, milliseconds

Hinweis: Einheiten sind weiterhin optional. Verwenden Sie nullals drittes Argument, um Einheiten zu ignorieren. In diesem Fall ist Millisekunden die Standardgranularität.

Besuchen Sie die offiziellen Dokumente

ThisClark
quelle
3
Denken Sie daran, dass isBetween, wie in den Dokumenten angegeben, exklusiv ist
Joaquín L. Robles
x.isBetween(moment(a).subtract(1, 'day'), b)scheint den Trick auch zu tun.
James Donnelly
@ThisClark Das ist eine gute Problemumgehung. !(x.isBefore(a) || x.isAfter(b))
Darf
Was heißt exclusivedas
Batman
2
@Batman Betrachten Sie die Liste 1,2,3,4,5. Ausschließlich 1 und 5 liegen nicht zwischen den Werten dieser Liste. Inklusive 1 und 5 liegen zwischen den Werten dieser Liste. Links inklusive (wie rechts exklusiv) enthält 1, aber nicht 5. Rechts inklusive (wie links exklusiv) enthält 5, aber nicht 1.
ThisClark
16

Ich glaube das

if (startDate <= date && date <= endDate) {
  alert("Yay");
} else {
  alert("Nay! :("); 
}

funktioniert auch ...

Tiele Declercq
quelle
Diese Berechnung ignoriert immer das Jahr. Wenn ich beispielsweise startDate = '05 -01-2019 ', endDate = '05 -31-2019' und das Datum '05 -21-2017 'gebe, wird das Ergebnis als "Yay" angezeigt, obwohl es falsch ist .
Aakash Maurya
1
@AakashMaurya Sie vergleichen Zeichenfolgen, keine Daten. Stellen Sie sicher, dass Sie Ihr startDate / endDate als startDate = new Date ("05-01-2019") definieren.
Tiele Declercq
13

Gute Nachrichten an alle, es gibt eine isBetweenFunktion! Aktualisiere deine Bibliothek;)

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

Luna
quelle
2
isBetween
Richtig,
4
Version 2.13.0 führt Exklusivität ein. A [zeigt die Aufnahme eines Wertes an. A (zeigt Ausschluss an. Wenn der Inklusivitätsparameter verwendet wird, müssen beide Indikatoren übergeben werden.moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
Ramratan Gupta
8

Bitte verwenden Sie den 4. Parameter von moment.isBetween (Inklusivität). Beispiel:

var startDate = moment("15/02/2013", "DD/MM/YYYY");
var endDate = moment("20/02/2013", "DD/MM/YYYY");

var testDate = moment("15/02/2013", "DD/MM/YYYY");

testDate.isBetween(startDate, endDate, 'days', true); // will return true
testDate.isBetween(startDate, endDate, 'days', false); // will return false
Raffael Bechara Rameh
quelle
5
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

ist logisch das gleiche wie

if (!(date.isBefore(startDate) || date.isAfter(endDate)))

Dadurch sparen Sie einige Codezeilen und (in einigen Fällen) Methodenaufrufe.

Könnte einfacher sein, als ein ganzes Plugin zu ziehen, wenn Sie dies nur ein- oder zweimal tun möchten.

Jamie Humphries
quelle
1

Gemäß Dokumentation von Moment js,

Das von Rob Dawson geschriebene Precise Range-Plugin kann verwendet werden, um genaue, für Menschen lesbare Darstellungen von Datums- / Zeitbereichen anzuzeigen. URL: http://codebox.org.uk/pages/moment-date-range-plugin

moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
// 1 year 2 months 3 days 4 hours 5 minutes 6 seconds

moment.preciseDiff("2014-01-01 12:00:00", "2014-04-20 12:00:00");
// 3 months 19 days
Mohammed Safeer
quelle