Moment.js: data tra le date


118

Sto cercando di rilevare con Moment.js se una determinata data è compresa tra due date. Dalla versione 2.0.0, Tim ha aggiunto isBefore()e isAfter()per il confronto delle date.

Poiché non esiste un isBetween()metodo, ho pensato che avrebbe funzionato:

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

Sono convinto che ci debba essere un modo migliore per farlo. Qualche idea?


Sono sicuro che volevi ? isBetween || isStart || isEnd
Bergi

Sì, errore di battitura lì, scusa!
Joel A. Villarreal Bertoldi

Risposte:


81

Puoi utilizzare uno dei plug -in dei momenti -> intervallo di momenti per gestire l'intervallo di date:

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
come includi il plugin?

2
Dovresti semplicemente includere <script src = "/ javascripts / moment-range.js"> </script> dopo momentjs
Lukasz Koziara

54
date.isBetween (startDate, endDate); è molto più semplice ed evita di richiedere un plug-in aggiuntivo.
Brendan Nee

moment & moment-Range fornisce opzioni per formattare la data e l'ora durante la preparazione degli intervalli e quindi confrontare le date per Contiene / Entro / Sovrapposizioni / Interseca / Aggiungi / Sottrai. se qualcuno recupera le date in un formato speciale, allora si può essere in grado di preparare intervalli di date all'interno di un array convertendo quelle date con il formato richiesto e quindi possiamo confrontare.
Sajjad Ali Khan

278

Nelle versioni 2.9+ c'è una isBetweenfunzione, ma è esclusiva:

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

C'è una soluzione alternativa ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... che è logicamente equivalente a
!(x.isBefore(a) || x.isAfter(b))


Nella versione 2.13 la isBetweenfunzione ha un quarto parametro opzionale inclusivity.

Usalo in questo modo:

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

Più unità da considerare: years, months, days, hours, minutes, seconds, milliseconds

Nota: le unità sono ancora opzionali. Utilizzare nullcome terzo argomento per ignorare le unità, nel qual caso i millisecondi sono la granularità predefinita.

Visita i documenti ufficiali


4
tenere presente che, come affermato nei documenti, isBetween è esclusivo
Joaquín L. Robles

x.isBetween(moment(a).subtract(1, 'day'), b)sembra fare anche il trucco.
James Donnelly,

@ThisClark Questa è una buona soluzione alternativa; potrei suggerirne un altro con meno chiamate di funzione:!(x.isBefore(a) || x.isAfter(b))
tavnab

Cosa exclusivesignifica?
Batman

2
@Batman Considera l'elenco 1,2,3,4,5. Esclusivamente, 1 e 5 non sono compresi tra i valori di questo elenco. Inclusivamente, 1 e 5 sono tra i valori di questo elenco. Incluso a sinistra (uguale all'esclusivo a destra) include 1, ma non 5. Incluso a destra (uguale all'esclusivo a sinistra) include 5, ma non 1.
ThisClark


16

Lo credo

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

funziona anche ...


Questo calcolo ignora sempre l'anno. Ad esempio, se fornisco startDate = '05 -01-2019 ', endDate = '05 -31-2019' e la data '05 -21-2017 ', il risultato sarà "Yay", sebbene sia falso .
Aakash Maurya

1
@AakashMaurya Stai confrontando stringhe, non date. Assicurati di definire la data di inizio / data di fine come data di inizio = nuova data ("05-01-2019").
Tiele Declercq

13

Buone notizie a tutti, c'è una isBetweenfunzione! Aggiorna la tua libreria;)

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


2
Vero ma isBetweennon inclusivo
Epoc

4
La versione 2.13.0 introduce l'esclusività. Un [indica l'inclusione di un valore. A (indica l'esclusione. Se viene utilizzato il parametro inclusività, entrambi gli indicatori devono essere superati.moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
Ramratan Gupta

8

Si prega di utilizzare il quarto parametro della funzione moment.isBetween (inclusività). Esempio:

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

è logicamente lo stesso di

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

che ti fa risparmiare un paio di righe di codice e (in alcuni casi) chiamate ai metodi.

Potrebbe essere più facile che inserire un intero plugin se vuoi farlo solo una o due volte.


1

Come da documentazione del momento js,

Esiste il plug-in Precise Range, scritto da Rob Dawson, che può essere utilizzato per visualizzare rappresentazioni esatte e leggibili dagli utenti di intervalli di data / ora, 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.