Moment.js: Data między datami

118

Próbuję wykryć za pomocą Moment.js, czy podana data przypada między dwiema datami. Od wersji 2.0.0 Tim dodał isBefore()i isAfter()do porównania dat.

Ponieważ nie ma isBetween()metody, pomyślałem, że to zadziała:

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! :("); }

Jestem przekonany, że musi być lepszy sposób na zrobienie tego. Jakieś pomysły?

Joel A. Villarreal Bertoldi
źródło
Jestem pewien, że chciałeś ? isBetween || isStart || isEnd
Bergi
Tak, literówka, przepraszam!
Joel A. Villarreal Bertoldi

Odpowiedzi:

81

Możesz użyć jednej z wtyczek chwili -> zakres momentu, aby poradzić sobie z zakresem dat:

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
Łukasz Koziara
źródło
1
jak dołączyć wtyczkę?
2
Powinieneś po prostu dołączyć <script src = "/ javascripts / moment-range.js"> </script> po momentjs
Łukasz Koziara
54
date.isBetween (startDate, endDate); jest znacznie prostszy i nie wymaga dodatkowej wtyczki.
Brendan Nee,
Moment i moment-Zakres zapewnia opcje formatowania daty i czasu podczas przygotowywania zakresów, a następnie porównywania dat dla Zawartości / Wewnątrz / Nakładanie / Przecięcie / Dodaj / Odejmij. jeśli ktoś pobiera daty w jakimś specjalnym formacie, to można przygotować zakresy dat w tablicy, konwertując te daty na wymagany format, a następnie możemy porównać.
Sajjad Ali Khan
278

W wersjach 2.9+ jest isBetweenfunkcja, ale jest ona wyłączna:

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

Istnieje integracyjne obejście ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... co jest logicznym odpowiednikiem
!(x.isBefore(a) || x.isAfter(b))


W wersji 2.13isBetween funkcja ma czwarty opcjonalny parametr inclusivity.

Użyj tego w ten sposób:

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

Więcej jednostek do rozważenia: years, months, days, hours, minutes, seconds, milliseconds

Uwaga: jednostki są nadal opcjonalne. Użyj nulljako trzeciego argumentu, aby zignorować jednostki, w przypadku których domyślną szczegółowością są milisekundy.

Odwiedź oficjalne dokumenty

ThisClark
źródło
4
pamiętaj, że, jak stwierdzono w dokumentach, isBetween jest ekskluzywny
Joaquín L. Robles
x.isBetween(moment(a).subtract(1, 'day'), b)wydaje się również działać.
James Donnelly
@ThisClark To dobre obejście; czy mógłbym zasugerować inny z mniejszą liczbą wywołań funkcji:!(x.isBefore(a) || x.isAfter(b))
tavnab
Co to exclusiveznaczy?
Batman
2
@Batman Rozważ listę 1,2,3,4,5. Wyłącznie 1 i 5 nie znajdują się między wartościami z tej listy. Włącznie, 1 i 5 znajdują się pomiędzy wartościami z tej listy. Lewy włącznie (tak samo jak prawy wyłączny) obejmuje 1, ale nie 5. Prawe włącznie (tak samo jak lewe wyłączne) obejmuje 5, ale nie 1.
ThisClark
16

Wierzę w to

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

też działa ...

Tiele Declercq
źródło
To obliczenie zawsze pomija rok. Na przykład, jeśli podam startDate = „05-01-2019”, endDate = „05-31-2019” i datę „05-21-2017”, otrzymam wynik jako „Yay”, chociaż jest fałszywy .
Aakash Maurya
1
@AakashMaurya Porównujesz ciągi znaków, a nie daty. Upewnij się, że zdefiniowałeś datę początkową / datę końcową jako startDate = new Date („05-01-2019”).
Tiele Declercq
13

Dobra wiadomość dla wszystkich, jest isBetweenfunkcja! Zaktualizuj swoją bibliotekę;)

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

Luna
źródło
2
Prawda, ale isBetweennie obejmuje
Epoc
4
Wersja 2.13.0 wprowadza wyłączność. A [wskazuje włączenie wartości. A (oznacza wykluczenie. Jeśli używany jest parametr inkluzywności, oba wskaźniki muszą zostać moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
zaliczone
8

Użyj czwartego parametru funkcji moment.isBetween (włączanie). Przykład:

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
źródło
5
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

jest logicznie taki sam jak

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

co pozwala zaoszczędzić kilka wierszy kodu i (w niektórych przypadkach) wywołań metod.

Może być łatwiejsze niż wciągnięcie całej wtyczki, jeśli chcesz to zrobić tylko raz lub dwa razy.

Jamie Humphries
źródło
1

Zgodnie z dokumentacją momentu js,

Istnieje wtyczka Precise Range, napisana przez Roba Dawsona, która może być używana do wyświetlania dokładnych, czytelnych dla człowieka reprezentacji zakresów dat / godzin, adres 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
źródło