web-dev-qa-db-fra.com

Moment.js: Date entre les dates

J'essaie de détecter avec Moment.js si une date donnée se situe entre deux dates. Depuis la version 2.0.0, Tim a ajouté isBefore() et isAfter() pour la comparaison de dates.

Puisqu'il n'y a pas de méthode isBetween(), j'ai pensé que cela fonctionnerait:

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

Je suis convaincu qu'il doit y avoir une meilleure façon de faire cela. Des idées?

100

Vous pouvez utiliser n plugin du moment -> moment-intervalle pour traiter l'intervalle de dates:

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
74
Lukasz Koziara

Dans les versions 2.9 + , il existe une fonction isBetween, mais elle est exclusive:

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

Il y a un contournement inclusif ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... qui est logiquement équivalent à
!(x.isBefore(a) || x.isAfter(b))


Dans version 2.13 , la fonction isBetween a un quatrième paramètre facultatif, inclusivity.

Utilisez-le comme ceci:

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

Plus d'unités à considérer: years, months, days, hours, minutes, seconds, milliseconds

Remarque: les unités sont toujours facultatives. Utilisez null comme troisième argument pour ignorer les unités, auquel cas la milliseconde est la granularité par défaut.

Visitez les documents officiels

231
ThisClark

Vous pouvez utiliser

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

ou

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

Voir ici: http://momentjs.com/docs/#/query/

20
Vijay Maheriya

Je crois que

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

fonctionne aussi ...

16
Tiele Declercq

Bonne nouvelle à tous, il y a une fonction isBetween! Mettez à jour votre bibliothèque;)

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

13
Luna

Veuillez utiliser le 4ème paramètre de la fonction moment.isBetween (inclusivité). Exemple:

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
6
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

est logiquement identique à

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

ce qui vous évite quelques lignes de code et (dans certains cas) des appels de méthodes.

Cela pourrait être plus facile que d’intégrer un plugin complet si vous ne voulez le faire qu’une ou deux fois.

5
Jamie Humphries

Selon la documentation du moment js,

Il y a un plugin Precise Range, écrit par Rob Dawson, peut être utilisé pour afficher des représentations exactes et lisibles des plages de dates/heures, 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
Mohammed Safeer