Moment JS - vérifier si une date est aujourd'hui ou dans le futur

222

J'essaie d'utiliser momentjspour vérifier si une date donnée est aujourd'hui ou dans le futur.

Voici ce que j'ai jusqu'à présent:

<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript">

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment().diff(SpecialTo) > 0) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

</script>

Le code évalue ma date (31 janvier 2014) comme une date antérieure.

Une idée de ce que je fais mal?

Latheesan
la source

Réponses:

197

Après avoir lu la documentation: http://momentjs.com/docs/#/displaying/difference/ , vous devez considérer la difffonction comme un opérateur moins.

                   // today < future (31/01/2014)
today.diff(future) // today - future < 0
future.diff(today) // future - today > 0

Par conséquent, vous devez inverser votre condition.

Si vous voulez vérifier que tout va bien, vous pouvez ajouter un paramètre supplémentaire à la fonction:

moment().diff(SpecialTo, 'days') // -8 (days)
Aurélien Thieriot
la source
75
cela ne fonctionnera pas si c'est un jour différent mais la différence est inférieure à 24 heures
galki
1
Travailler, peu importe si le décalage horaire est inférieur à 24 heures.
zanderwar
3
Ne travaille pas pour moi. Si le jour est +1 dans le moment futur (). Diff (SpecialTo, 'days') me donne -0 (zéro négatif)
gavroche
2
Aujourd'hui ne signifie pas dans les prochaines 24 heures. isSame est une bonne solution.
Kasper Ziemianek
1
moment().diff(SpecialToDate)donnera directement la différence en millisecondes. 'days'n'est pas nécessaire. Cela fonctionnera pour tous les scénarios. SpecialToDate peut être '2018-10-26 00:00:00'un exemple.
backslashN
312

Vous pouvez utiliser la isSamefonction:

var iscurrentDate = startTime.isSame(new Date(), "day");
if(iscurrentDate) {

}
Loup gris
la source
cela correspond-il aussi à l'année et au mois?
SuperUberDuper
13
Il doit correspondre à l'année et au mois. moment ('2010-01-01'). isSame ('2011-01-01', 'mois'); // false, moment de l'année différent ('2010-01-01'). isSame ('2010-02-01', 'day'); // faux, mois différent
Grey Wolf
6
Cela ne répond même pas à la question du PO ... "aujourd'hui OU DANS L'AVENIR", et c'est quoi startTime? L'objet date n'a pas de isSameméthode ...
Sharcoux
1
@Sharcoux Cette question concerne momentjs, donc clairement c'est un objet moment.
Nathan
157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');
Akis
la source
85

Étant donné que personne ne semble l'avoir encore mentionné, la façon la plus simple de vérifier si un objet de date Moment est dans le passé:

momentObj.isBefore()

Ou à l'avenir:

momentObj.isAfter()

Laissez simplement les arguments vides - ce sera par défaut à maintenant.

Il y a aussi isSameOrAfteret isSameOrBefore.

NB ceci prend en compte le temps. Si vous ne vous souciez que de la journée, consultez la réponse de Dipendu .

mpen
la source
1
Les documents expliquent qu'il s'agit d'un comportement non défini, vous ne devez donc pas le faire: momentjs.com/docs/#/query/is-before
Dancrumb
13
@Dancrumb Relisez-le. "Si rien n'est transmis au moment # isBefore, il sera par défaut à l'heure actuelle." Le momentObjdans mon exemple est une instance d'une date de moment. Les documents parlent spécifiquement de la création d'une nouvelle instance (heure actuelle), puis de vérifier si elle est dans le passé, en une seule instruction. Je ne vous suggère pas de faire moment().isBefore()ce qui est totalement inutile - pourquoi voudriez-vous vérifier si c'est maintenant dans le passé (ou futur)?
mpen
83

Vous pouvez utiliser la isAfter()fonction de requête de momentjs:

Vérifiez si un moment est après un autre moment.

moment('2010-10-20').isAfter('2010-10-19'); // true

Si vous souhaitez limiter la granularité à une unité autre que les millisecondes, passez les unités comme deuxième paramètre.

moment('2010-10-20').isAfter('2010-01-01', 'year'); // false

moment('2010-10-20').isAfter('2009-12-31', 'year'); // true

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

dbasch
la source
Le constructeur qui prend une chaîne de date est obsolète.
Vahid Amiri
@VahidAmiri Les documents ne le mentionnent pas. Ils suggèrent cependant que nous utilisons le constructeur string + format si nous n'utilisons pas ISO 8601 . Donc, à moins que l'on n'utilise certains formats de date étranges, il est correct d'utiliser uniquement une chaîne.
johndodo
15

inverser la méthode de moment isBefore pour vérifier si une date est la même qu'aujourd'hui ou à l'avenir comme ceci:

!moment(yourDate).isBefore(moment(), "day");
Dipendu Paul
la source
10

Juste au cas où quelqu'un d'autre en aurait besoin, faites-le:

const isToday = moment(0, "HH").diff(date, "days") == 0;

ou si vous voulez une fonction:

isToday = date => moment(0,"HH").diff(date, "days") == 0;

date est la date que vous souhaitez vérifier.

Explication

moment(0, "HH") renvoie le jour d'aujourd'hui à minuit.

date1.diff(date2, "days") renvoie le nombre de jours entre la date1 et la date2.

Mettre à jour

Depuis, j'ai trouvé la fonction isSame , qui, à mon avis, est la bonne fonction à utiliser pour déterminer si une date est aujourd'hui:

moment().isSame('2010-02-01', 'day'); // Return true if we are the 2010-02-01
François Nadeau
la source
8

Pour vérifier si c'est aujourd'hui :

Si nous comparons deux dates qui contiennent également l'heure, les informations isSameéchoueront évidemment. difféchouera dans le cas où les deux dates s'étendent sur le nouveau jour:

var date1 = moment("01.01.2016 23:59:00", "DD.MM.YYYY HH.mm.ss");
var date2 = moment("02.01.2016 00:01:00", "DD.MM.YYYY HH.mm.ss");
var diff = date2.diff(date1); // 2seconds

Je pense que la meilleure façon, même si elle n'est pas rapide et courte, est la suivante:

var isSame = date1.date() == date2.date() && date1.month() == date2.month() && date1.year() == date2.year()

Pour vérifier si c'est dans le futur :

Comme suggéré également par d'autres utilisateurs, la diffméthode fonctionne.

var isFuture = now.diff(anotherDate) < 0 
Emaborsa
la source
7

Si vous avez seulement besoin de savoir lequel est le plus gros, vous pouvez également les comparer directement:

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment() > SpecialTo) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

J'espère que cela t'aides!

jsidera
la source
4

si firstDate est le même ou après (futur) secondDate return true else return false. Toda est firstDate = new Date ();

  static isFirstDateSameOrAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isSameOrBefore(date2,'day');
    }
    return false;
  }

Il existe des exemples isSame, isBefore et isAfter for day compare moment;

  static isFirstDateSameSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if (date1 && date2) {
      return date1.isSame(date2,'day');
    }
    return false;
  }

  static isFirstDateAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isAfter(date2,'day');
    }
    return false;
  }

  static isFirstDateBeforeSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isBefore(date2,'day');
    }
    return false;
  }
éthemsulan
la source
3

Utilisez le plus simple pour vérifier la date future

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");
Ali Adravi
la source
2
function isTodayOrFuture(date){
  date = stripTime(date);
  return date.diff(stripTime(moment.now())) >= 0;
}

function stripTime(date){
  date = moment(date);
  date.hours(0);
  date.minutes(0);
  date.seconds(0);
  date.milliseconds(0);
  return date;
}

Et puis il suffit de l'utiliser en ligne ceci:

isTodayOrFuture(YOUR_TEST_DATE_HERE)
Tanzeel
la source
1

Sélectionnez hier pour vérifier les jours passés ou non avec l'aide de moment().subtract(1, "day");

Référence: - http://momentjs.com/docs/#/manipulating/subtract/

function myFunction() {
  var yesterday = moment().subtract(1, "day").format("YYYY-MM-DD");
  var SpecialToDate = document.getElementById("theDate").value;

  if (moment(SpecialToDate, "YYYY-MM-DD", true).isAfter(yesterday)) {
    alert("date is today or in future");
    console.log("date is today or in future");
  } else {
    alert("date is in the past");
    console.log("date is in the past");
  }
}
<script src="http://momentjs.com/downloads/moment.js"></script>
<input type="date" id="theDate" onchange="myFunction()">

Mo.
la source
1

Si nous voulons une différence sans l'heure, vous pouvez obtenir une date différente (uniquement la date sans l'heure) comme ci-dessous, en utilisant le format du moment.

Comme, j'étais confronté à un problème avec la différence en faisant;

moment().diff([YOUR DATE])

Donc, est venu avec suivre;

const dateValidate = moment(moment().format('YYYY-MM-DD')).diff(moment([YOUR SELECTED DATE HERE]).format('YYYY-MM-DD'))

IF dateValidate > 0 
   //it's past day
else
   //it's current or future

N'hésitez pas à commenter s'il y a quelque chose à améliorer.

Merci,

Rajan Maharjan
la source
3
Veuillez consulter Comment rédiger une bonne réponse . Les réponses uniquement codées sont déconseillées car elles n'expliquent pas comment elles résolvent le problème. Vous devez mettre à jour votre réponse pour expliquer ce que cela fait et comment il améliore les nombreuses réponses que cette question a déjà .
FluffyKitten
0

je le voulais pour autre chose mais j'ai finalement trouvé une astuce que vous pouvez essayer

somedate.calendar(compareDate, { sameDay: '[Today]'})=='Today'

var d = moment();
 var today = moment();
 
 console.log("Usign today's date, is Date is Today? ",d.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
 var someRondomDate = moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Usign Some Random Date, is Today ?",someRondomDate.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
  
 var anotherRandomDate =  moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Two Random Date are same date ? ",someRondomDate.calendar(anotherRandomDate, {
    sameDay: '[Today]'})=='Today');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

abhirathore2006
la source
0

vérifier avec les éléments suivants:

let isContinue = moment().diff('2020-04-04T20:06:11+05:30')/1000

il revient en quelques secondes ..

Si vérifiera comme condition de 2 minutes alors

if (isContinue < 120) {
  ..To check otp details or further logic
} else {
   // otp is getting invalid
}
Anupam Maurya
la source
0

La réponse la plus simple sera:

const firstDate = moment('2020/10/14'); // the date to be checked
const secondDate = moment('2020/10/15'); // the date to be checked

firstDate.startOf('day').diff(secondDate.startOf('day'), 'days'); // result = -1
secondDate.startOf('day').diff(firstDate.startOf('day'), 'days'); // result = 1

Il vérifiera avec la valeur de minuit et retournera un résultat précis. Cela fonctionnera également lorsque le décalage horaire entre deux dates est également inférieur à 24 heures.

SKR
la source