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?


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

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


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


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/


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

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.


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