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?


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

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


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


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/


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.