Moment JS: compruebe si una fecha es hoy o en el futuro

222

Estoy tratando de usar momentjspara verificar si una fecha determinada es hoy o en el futuro.

Esto es lo que tengo hasta ahora:

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

El código está evaluando mi fecha (31 de enero de 2014) como una fecha pasada.

¿Alguna idea de lo que estoy haciendo mal?

Latheesan
fuente

Respuestas:

197

Después de leer la documentación: http://momentjs.com/docs/#/displaying/difference/ , debe considerar la difffunción como un operador negativo.

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

Por lo tanto, debe revertir su condición.

Si desea verificar que todo esté bien, puede agregar un parámetro adicional a la función:

moment().diff(SpecialTo, 'days') // -8 (days)
Aurélien Thieriot
fuente
75
esto no funcionará si es un día diferente, pero la diferencia es menos de 24 horas
galki
1
Trabajando, independientemente de si la diferencia horaria es inferior a 24 horas.
zanderwar
3
No funciona para mi Si el día es +1 en el momento futuro (). Diff (SpecialTo, 'días') me da -0 (cero negativo)
gavroche
2
Hoy no significa en las próximas 24 horas. isSame es una buena solución.
Kasper Ziemianek
1
moment().diff(SpecialToDate)directamente dará la diferencia en milisegundos. 'days'no es necesario. Esto funcionará para todos los escenarios. SpecialToDate puede ser '2018-10-26 00:00:00'por ejemplo.
barra invertidaN
312

Puedes usar la isSamefunción:

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

}
Lobo gris
fuente
¿coincide esto año y mes también?
SuperUberDuper
13
Debe coincidir año y mes. moment ('2010-01-01'). isSame ('2011-01-01', 'month'); // falso, momento de año diferente ('2010-01-01'). isSame ('2010-02-01', 'day'); // falso, mes diferente
Lobo gris
66
Esto ni siquiera responde la pregunta del OP ... "hoy O EN EL FUTURO", ¿y qué es startTime? El objeto de fecha no tiene un isSamemétodo ...
Sharcoux
1
@Sharcoux Esta pregunta es sobre momentjs, por lo que claramente es un objeto momentáneo.
Nathan
157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');
Akis
fuente
85

Como nadie parece haberlo mencionado todavía, la forma más simple de verificar si un objeto de fecha Moment está en el pasado:

momentObj.isBefore()

O en el futuro:

momentObj.isAfter()

Simplemente deje los argumentos en blanco, eso estará predeterminado por ahora.

También hay isSameOrAftery isSameOrBefore.

NB esto factores en el tiempo. Si solo te importa el día, mira la respuesta de Dipendu .

mpen
fuente
1
Los documentos explican que este es un comportamiento indefinido, por lo que no debe hacer esto: momentjs.com/docs/#/query/is-before
Dancrumb
13
@Dancrumb Léelo de nuevo. "Si no se pasa nada al momento # isBefore, el valor predeterminado será la hora actual". El momentObjen mi ejemplo es una instancia de una fecha de momento. Los documentos hablan específicamente de crear una nueva instancia (hora actual) y luego verificar si está en el pasado, en una declaración. Estoy no sugiere que haces moment().isBefore(), que es completamente inútil - ¿por qué se comprueba si ya está en el pasado (o futuro)?
mpen
83

Puede usar la isAfter()función de consulta de momentjs:

Compruebe si un momento es después de otro momento.

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

Si desea limitar la granularidad a una unidad que no sea milisegundos, pase las unidades como segundo parámetro.

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
fuente
El constructor que toma una cadena de fecha está en desuso.
Vahid Amiri
@VahidAmiri Los documentos no mencionan esto. Sin embargo, sugieren que usemos el constructor de cadena + formato si no usamos ISO 8601 . Entonces, a menos que uno esté usando algunos formatos de fecha extraños, está bien usar solo una cadena.
johndodo
15

invierta es Antes del método de momento para verificar si una fecha es la misma que hoy o en el futuro de esta manera:

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

En caso de que alguien más necesite esto, solo haz esto:

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

o si quieres una función:

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

Donde fecha es la fecha que desea verificar.

Explicación

moment(0, "HH") vuelve el día de hoy a medianoche.

date1.diff(date2, "days") devuelve el número de días entre date1 y date2.

Actualizar

Desde entonces, he encontrado la función isSame , que creo que es la función correcta para determinar si una fecha es hoy:

moment().isSame('2010-02-01', 'day'); // Return true if we are the 2010-02-01
Francois Nadeau
fuente
8

Para verificar si es hoy :

Si comparamos dos fechas que contienen también la información de tiempo isSameobviamente fallará. difffallará en caso de que las dos fechas abarquen el nuevo día:

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

Creo que la mejor manera, incluso si no es rápida y corta, es la siguiente:

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

Para verificar si es en el futuro :

Según lo sugerido también por otros usuarios, el diffmétodo funciona.

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

Si solo necesita saber cuál es más grande, también puede compararlos directamente:

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

¡Espero que esto ayude!

jsidera
fuente
4

si firstDate es el mismo o después (futuro) secondDate return true sino devuelve false. Toda es 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;
  }

Hay isSame, isBefore y isAfter para ejemplo de momento de comparación de días;

  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;
  }
etemsulano
fuente
3

Use el más simple para verificar la fecha futura

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");
Ali Adravi
fuente
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;
}

Y luego solo utilízalo en línea:

isTodayOrFuture(YOUR_TEST_DATE_HERE)
Tanzeel
fuente
1

Seleccione ayer para verificar los días pasados ​​o no con la ayuda de moment().subtract(1, "day");

Referencia: - 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()">

Mes.
fuente
1

Si queremos diferencia sin el tiempo, puede obtener la fecha diferente (solo fecha sin tiempo) como a continuación, utilizando el formato de momento.

Como, estaba enfrentando un problema con la diferencia mientras lo hacía;

moment().diff([YOUR DATE])

Entonces, se me ocurrió seguir;

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

Por favor, siéntase libre de comentar si hay algo para mejorar.

Gracias,

Rajan Maharjan
fuente
3
Por favor, revise Cómo escribir una buena respuesta . Se desaconsejan las respuestas de solo código porque no explican cómo resuelven el problema. Debe actualizar su respuesta para explicar qué hace esto y cómo mejora las muchas respuestas que esta pregunta ya tiene .
FluffyKitten
0

Lo quería para otra cosa, pero finalmente encontré un truco que puedes probar

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
fuente
0

consulte con lo siguiente:

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

Está regresando en segundos.

Si se comprobará como condición de 2 minutos, entonces

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

La respuesta más simple será:

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

Verificará con el valor de medianoche y devolverá un resultado preciso. También funcionará cuando la diferencia de tiempo entre dos fechas sea inferior a 24 horas también.

SKR
fuente