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?


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

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


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 ...


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/


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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.