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?

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)

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

}

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

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 .


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/


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");

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

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 

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!


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

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");

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)

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


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,


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>


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
}

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.