Momento JS - verifique se uma data é hoje ou no futuro

222

Estou tentando usar momentjspara verificar se uma determinada data é hoje ou no futuro.

Isto é o que eu tenho até agora:

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

O código está avaliando minha data (31 de janeiro de 2014) como uma data anterior.

Alguma idéia do que estou fazendo de errado?

Latheesan
fonte

Respostas:

197

Depois de ler a documentação: http://momentjs.com/docs/#/displaying/difference/ , você deve considerar a difffunção como um operador negativo.

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

Portanto, você deve reverter sua condição.

Se você quiser verificar se está tudo bem, você pode adicionar um parâmetro extra à função:

moment().diff(SpecialTo, 'days') // -8 (days)
Aurélien Thieriot
fonte
75
isso não vai funcionar se é um dia diferente, mas a diferença é menos de 24 horas
galki
1
Trabalhando, independentemente de a diferença horária ser inferior a 24 horas.
Zanderwar 12/05
3
Não está trabalhando para mim. . Se dia é um momento no futuro () diff (SpecialTo, 'dias') me dá -0 (negativo zero)
gavroche
2
Hoje não significa nas próximas 24 horas. isSame é uma boa solução.
Kasper Ziemianek 5/08/16
1
moment().diff(SpecialToDate)dará diretamente a diferença em milissegundos. 'days'Não é necessário. Isso funcionará para todos os cenários. SpecialToDate pode ser '2018-10-26 00:00:00'um exemplo.
backslashN
312

Você pode usar a isSamefunção:

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

}
Lobo cinzento
fonte
isso combina ano e mês também?
SuperUberDuper
13
É preciso combinar ano e mês. momento ('2010-01-01'). isSame ('2011-01-01', 'month'); // falso, momento diferente do ano ('01-01-2010'). isSame ('01-02-2010', 'dia'); // mês falso, diferente
Grey Wolf
6
Isso nem responde à pergunta do OP ... "hoje OU NO FUTURO", e o que é startTime? Data objeto não tem um isSamemétodo ...
Sharcoux
1
@ Sharcoux Esta pergunta é sobre momentjs, então claramente é um objeto moment.
Nathan
157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');
Akis
fonte
85

Como ninguém parece ter mencionado ainda, a maneira mais simples de verificar se um objeto de data do momento está no passado:

momentObj.isBefore()

Ou no futuro:

momentObj.isAfter()

Apenas deixe os argumentos em branco - o padrão será agora.

Há também isSameOrAftere isSameOrBefore.

NB isso fatores no tempo. Se você se importa apenas com o dia, consulte a resposta do Dipendu .

mpen
fonte
1
Os médicos explicam que este é um comportamento indefinido, para que você não deve fazer isso: momentjs.com/docs/#/query/is-before
Dancrumb
13
@ Dancrumb Leia novamente. "Se nada for passado para o momento # isBefore, o padrão será o horário atual." O momentObjno meu exemplo é uma instância de uma data de momento. Os documentos estão falando especificamente sobre a criação de uma nova instância (hora atual) e, em seguida, verificando se ela está no passado, em uma declaração. Estou não sugerindo que você faz moment().isBefore()que é totalmente inútil - por que você iria verificar se agora está no passado (ou futuro)?
MPEN
83

Você pode usar a isAfter()função de consulta do momentjs:

Verifique se um momento é depois de outro momento.

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

Se você deseja limitar a granularidade a uma unidade diferente de milissegundos, passe as unidades como o 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
fonte
O construtor que utiliza uma sequência de datas foi descontinuado.
Vahid Amiri
@VahidAmiri Os documentos não mencionam isso. No entanto, eles sugerem que usamos construtor string + format se não usarmos o ISO 8601 . Portanto, a menos que alguém esteja usando alguns formatos de data estranhos, não há problema em usar apenas uma string.
Johndodo
15

invert é o método de momento antes para verificar se uma data é igual a hoje ou no futuro, como esta:

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

Apenas no caso de alguém precisar disso, faça o seguinte:

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

ou se você deseja uma função:

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

Onde date é a data que você deseja verificar.

Explicação

moment(0, "HH") retorna o dia de hoje à meia-noite.

date1.diff(date2, "days") retorna o número de dias entre a data1 e a data2.

Atualizar

Desde então, encontrei a função isSame , que acredito ser a função correta para descobrir se uma data é hoje:

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

Para verificar se é hoje :

Se compararmos duas datas que também contêm a informação de tempo isSame, obviamente falhará. difffalhará caso as duas datas se estendam no novo dia:

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

Eu acho que a melhor maneira, mesmo que não seja rápida e curta, é a seguinte:

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

Para verificar se está no futuro :

Conforme sugerido também por outros usuários, o diffmétodo funciona.

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

Se você só precisa saber qual é maior, também pode compará-las diretamente:

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 isto ajude!

jsidera
fonte
4

se firstDate for o mesmo ou depois (futuro) secondDate return true senão return false. Toda é 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;
  }

Existe o exemplo isSame, isBefore e 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;
  }
ethemsulan
fonte
3

Use o mais simples para verificar a data futura

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

E então basta usá-lo alinhar isto:

isTodayOrFuture(YOUR_TEST_DATE_HERE)
Tanzeel
fonte
1

Selecione ontem para verificar os últimos dias ou não com a ajuda de moment().subtract(1, "day");

Referência: - 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.
fonte
1

Se quisermos diferença sem a hora, você pode obter uma data diferente (somente data sem hora) como abaixo, usando o formato do momento.

Como, eu estava enfrentando problemas com a diferença enquanto fazia;

moment().diff([YOUR DATE])

Então, veio com o seguinte;

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, sinta-se livre para comentar se há algo para melhorar.

Obrigado,

Rajan Maharjan
fonte
3
Por favor, revise Como escrever uma boa resposta . As respostas somente de código são desencorajadas porque não explicam como resolvem o problema. Você deve atualizar sua resposta para explicar o que isso faz e como ele melhora as muitas respostas que essa pergunta já possui .
FluffyKitten 14/10
0

Eu queria isso para outra coisa, mas finalmente encontrei um truque que você pode tentar

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

verifique com o seguinte:

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

está retornando em segundos ..

Se irá verificar como 2 minutos condição então

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

A resposta mais simples 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

Ele verificará com o valor da meia-noite e retornará um resultado preciso. Também funcionará quando a diferença de horário entre duas datas for inferior a 24 horas.

SKR
fonte