Pregunta Moment.js: fecha entre fechas


Estoy tratando de detectar con Moment.js si una fecha determinada está entre dos fechas. Desde la versión 2.0.0, Tim agregó isBefore() y isAfter() para la comparación de fechas.

Como no hay isBetween() método, pensé que esto funcionarí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)) ) {   alerta ("¡Sí!"); } else {   alerta ("¡No! :("); }


73
2018-02-15 15:09


origen


Respuestas:


Puedes usar uno de los plugins de momento -> rango de momento para lidiar con el rango de fechas:

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

55
2018-02-15 15:56



En versiones 2.9+ hay un isBetween función, pero es exclusivo:

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

Hay una solución inclusiva ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... que es lógicamente equivalente a
!(x.isBefore(a) || x.isAfter(b))


En versión 2.13 el isBetween la función tiene un cuarto parámetro opcional, inclusivity.

Úselo así:

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

Más unidades a considerar: years, months, days, hours, minutes, seconds, milliseconds

Nota: las unidades siguen siendo opcionales. Utilizar null como el tercer argumento para ignorar unidades en cuyo caso milisegundos es la granularidad predeterminada.

Visita los documentos oficiales


164
2018-04-07 15:45



Yo creo que

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

funciona también ...


14
2018-04-10 11:55



Puedes usar

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);

o

moment().isBetween(moment-like, moment-like);

Mira aquí : http://momentjs.com/docs/#/query/


14
2017-10-21 10:55



Buenas noticias a todos, hay un isBetween ¡función! Actualiza tu biblioteca;)

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


11
2018-03-17 19:10



Utilice el 4 ° parámetro de la función momento.isentre (inclusividad). Ejemplo:

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
2017-10-17 12:28



if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

es lógicamente el mismo que

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

lo que le ahorra un par de líneas de código y (en algunos casos) llamadas a métodos.

Puede ser más fácil que usar un complemento completo si solo desea hacer esto una o dos veces.


4
2018-03-05 10:26



Según la documentación del momento js,

Existe el plugin Precise Range, escrito por Rob Dawson, que se puede usar para mostrar representaciones exactas, legibles por el ser humano de rangos de fecha / hora, 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

1
2017-11-12 12:01