Moment.js: Date entre les dates

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

Comme il n'y a pas de méthode isBetween() , je pensais 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"); 

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))
) {
Alerte ("Yay!");
} autre {
Alerte ("Nay! :(");
}

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

Vous pouvez utiliser l' un des plugins instantanés -> moment-range 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 

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

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

Dans la version 2.13, la fonction isBetween comporte un quatrième paramètre optionnel, 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 encore optionnelles. Utilisez null comme le troisième argument pour ignorer les unités, auquel cas les millisecondes sont la granularité par défaut.

Visiter les documents officiels

Je crois que

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

Fonctionne aussi …

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

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

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/

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

Est logiquement le même que

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

Ce qui vous permet d'économiser quelques lignes de code et (dans certains cas) des appels de méthode.

Peut-être plus facile que d'extraire un plugin complet si vous voulez seulement le faire une ou deux fois.

Utilisez 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 

Comme par documentation du moment js,

Il existe un plugin Precise Range, écrit par Rob Dawson, qui peut être utilisé pour afficher des représentations exactes et respectueuses de l'humain des plages de date et heure, 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