140 votes

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() y isAfter() pour la comparaison des dates.

Puisqu'il n'y a pas isBetween() méthode, j'ai pensé que ça pourrait marcher :

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 un meilleur moyen de faire ça. Des idées ?

334voto

ThisClark Points 22

Sur versions 2.9 et plus il existe un isBetween mais c'est exclusif :

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 existe une solution de contournement inclusive ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

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

Sur version 2.13 el isBetween a un quatrième paramètre facultatif, inclusivity .

Utilisez-le comme ça :

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

D'autres 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 ne pas tenir compte des unités, auquel cas les millisecondes sont la granularité par défaut.

Visitez les Docs officiels

97voto

Lukasz Koziara Points 2052

Vous pouvez utiliser un plugin du moment -> gamme de moments pour traiter la plage 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

30voto

Vijay Maheriya Points 1004

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/

16voto

Tiele Declercq Points 454

Je crois vraiment que

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

fonctionne aussi...

15voto

Luna Points 476

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X