Moment.js: Date entre les dates

118

J'essaye 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.

Puisqu'il n'y a pas de isBetween()méthode, 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?

Joel A. Villarreal Bertoldi
la source
Je suis sûr que tu voulais ? isBetween || isStart || isEnd
Bergi
Ouais, faute de frappe, désolé!
Joel A. Villarreal Bertoldi

Réponses:

81

Vous pouvez utiliser l' un des plugins moment -> moment-range pour gérer 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
Lukasz Koziara
la source
1
comment incluez-vous le plugin?
2
Vous devriez simplement inclure <script src = "/ javascripts / moment-range.js"> </script> après momentjs
Lukasz Koziara
54
date.isB Between (startDate, endDate); est beaucoup plus simple et évite de nécessiter un plugin supplémentaire.
Brendan Nee
moment & moment-Range fournit des options pour formater la date et l'heure lors de la préparation des plages, puis comparer les dates pour Contient / Dans / Chevauchements / Intersection / Ajouter / Soustraire. si quelqu'un récupère des dates dans un format spécial, alors on peut préparer des plages de dates à l'intérieur du tableau en convertissant ces dates avec le format requis, puis nous pouvons comparer.
Sajjad Ali Khan du
278

Dans les versions 2.9+, il existe une isBetweenfonction, 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 contournement inclusive ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

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


Dans la version 2.13 de la isBetweenfonction a 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 toujours en option. À utiliser nullcomme troisième argument pour ignorer les unités, auquel cas les millisecondes sont la granularité par défaut.

Consultez la documentation officielle

ThisClark
la source
4
gardez à l'esprit que, comme indiqué dans la documentation, isBetween est exclusif
Joaquín L. Robles
x.isBetween(moment(a).subtract(1, 'day'), b)semble faire l'affaire aussi.
James Donnelly
@ThisClark C'est une bonne solution de contournement; puis-je en suggérer un autre avec moins d'appels de fonction:!(x.isBefore(a) || x.isAfter(b))
tavnab
Que veut exclusivedire?
Batman
2
@Batman Considérez la liste 1,2,3,4,5. Exclusivement, 1 et 5 ne sont pas entre les valeurs de cette liste. Inclusivement, 1 et 5 sont entre les valeurs de cette liste. Gauche incluse (identique à droite exclusive) comprend 1, mais pas 5. Droite incluse (identique à gauche exclusive) comprend 5, mais pas 1.
ThisClark
16

Je crois que

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

fonctionne aussi ...

Tiele Declercq
la source
Ce calcul ignore toujours l'année. Par exemple, si je donne startDate = '05 -01-2019 ', endDate = '05 -31-2019' et date comme '05 -21-2017 ', cela me donnera le résultat comme "Yay", bien qu'il soit faux .
Aakash Maurya
1
@AakashMaurya Vous comparez des chaînes, pas des dates. Assurez-vous que vous définissez votre startDate / endDate comme startDate = new Date ("05-01-2019").
Tiele Declercq
13

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

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

Luna
la source
2
Vrai mais isBetweenn'est pas inclusif
Epoc
4
La version 2.13.0 introduit l'exclusivité. Un [indique l'inclusion d'une valeur. A (indique l'exclusion. Si le paramètre d'inclusivité est utilisé, les deux indicateurs doivent être passés.moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
Ramratan Gupta
8

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
Raffael Bechara Rameh
la source
5
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.

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

Jamie Humphries
la source
1

Selon la 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 lisibles par l'homme des plages de date / 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
Mohammed Safeer
la source