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