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?
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
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.
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/
Je crois que
if (startDate <= date && date <= endDate) {
alert("Yay");
} else {
alert("Nay! :(");
}
fonctionne aussi ...
Bonne nouvelle à tous, il y a une fonction isBetween
! Mettez à jour votre bibliothèque;)
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
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.
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