Momento JS: controlla se una data è oggi o in futuro


222

Sto cercando di utilizzare momentjsper verificare se una determinata data è oggi o in futuro.

Questo è quello che ho finora:

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

Il codice sta valutando la mia data (31 gennaio 2014) come una data passata.

Hai idea di cosa sto facendo di sbagliato?

Risposte:


197

Dopo aver letto la documentazione: http://momentjs.com/docs/#/displaying/difference/ , è necessario considerare la difffunzione come un operatore meno.

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

Pertanto, devi invertire le tue condizioni.

Se vuoi verificare che tutto vada bene, puoi aggiungere un ulteriore parametro alla funzione:

moment().diff(SpecialTo, 'days') // -8 (days)

75
questo non funzionerà se è un giorno diverso ma la differenza è inferiore a 24 ore
galki

1
Funziona, indipendentemente dal fatto che la differenza di tempo sia inferiore a 24 ore.
Zanderwar,

3
Non funziona per me. Se il giorno è +1 in un momento futuro (). Diff (SpecialTo, 'giorni') mi dà -0 (zero negativo)
gavroche

2
Oggi non significa nelle prossime 24 ore. isSame è una buona soluzione.
Kasper Ziemianek,

1
moment().diff(SpecialToDate)darà direttamente la differenza in millisecondi. 'days'non è necessario. Questo funzionerà per tutti gli scenari. SpecialToDate può essere '2018-10-26 00:00:00'un esempio.
barra rovesciataN

312

Puoi usare la isSamefunzione:

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

}

coincide anche con questo anno e mese?
SuperUberDuper

13
Deve corrispondere anno e mese. moment ('2010-01-01'). isSame ('2011-01-01', 'mese'); // falso, momento dell'anno diverso ("2010-01-01"). isSame ("2010-02-01", "giorno"); // falso, mese diverso
Grey Wolf

6
Questo non risponde nemmeno alla domanda del PO ... "oggi O NEL FUTURO", e cos'è startTime? L'oggetto Date non ha un isSamemetodo ...
Sharcoux,

1
@Sharcoux Questa domanda riguarda momentjs, quindi chiaramente è un oggetto moment.
Nathan

157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');

85

Poiché nessuno sembra averlo ancora menzionato, il modo più semplice per verificare se un oggetto data Moment è in passato:

momentObj.isBefore()

O in futuro:

momentObj.isAfter()

Lascia vuoto l'args - per impostazione predefinita ora.

C'è anche isSameOrAftere isSameOrBefore.

NB questo fattore nel tempo. Se ti interessa solo il giorno, vedi la risposta di Dipendu .


1
I documenti spiegano che si tratta di un comportamento indefinito, quindi non dovresti farlo: momentjs.com/docs/#/query/is-before
Dancrumb,

13
@Dancrumb Leggi di nuovo. "Se non viene passato nulla al momento # isBefore, verrà impostato automaticamente l'ora corrente." Nel momentObjmio esempio è un'istanza di una data momentanea. I documenti parlano in particolare della creazione di una nuova istanza (ora corrente) e quindi del controllo se è nel passato, in un'unica istruzione. Sto Non suggerendo che fai moment().isBefore(), che è del tutto inutile - perché si dovrebbe controllare se ora è nel passato (o futuro)?
Aprire il

83

È possibile utilizzare la isAfter()funzione di query di momentjs:

Controlla se un momento è dopo un altro momento.

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

Se si desidera limitare la granularità a un'unità diversa dai millisecondi, passare le unità come secondo parametro.

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/


Il costruttore che accetta una stringa di date è obsoleto.
Vahid Amiri,

@VahidAmiri I documenti non menzionano questo. Suggeriscono comunque di usare il costruttore string + format se non utilizziamo ISO 8601 . Quindi, a meno che uno non stia utilizzando alcuni strani formati di data, è OK usare solo una stringa.
johndodo,

15

inverti isBefore metodo del momento per verificare se una data è uguale a oggi o in futuro in questo modo:

!moment(yourDate).isBefore(moment(), "day");

10

Nel caso in cui qualcun altro ne abbia bisogno, basta fare questo:

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

o se vuoi una funzione:

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

Dove data è la data che si desidera verificare.

Spiegazione

moment(0, "HH") ritorna il giorno di oggi a mezzanotte.

date1.diff(date2, "days") restituisce il numero di giorni tra la data1 e la data2.

Aggiornare

Da allora ho trovato la funzione isSame , che credo sia la funzione corretta da usare per capire se una data è oggi:

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

8

Per verificare se è oggi :

Se confrontiamo due date che contengono anche le informazioni sull'orario isSameovviamente falliranno. difffallirà nel caso in cui le due date si estendano nel nuovo giorno:

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

Penso che il modo migliore, anche se non sia rapido e breve, sia il seguente:

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

Per verificare se è in futuro :

Come suggerito anche da altri utenti, il diffmetodo funziona.

var isFuture = now.diff(anotherDate) < 0 

7

Se hai solo bisogno di sapere quale è più grande, puoi anche confrontarli direttamente:

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

Spero che questo ti aiuti!


4

se firstDate è uguale o successivo (futuro) secondDate return true altrimenti 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;
  }

C'è isSame, isBefore ed isAfter for day confronta il momento di esempio;

  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

Usa quello più semplice per verificare la data 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;
}

E poi basta usarlo linea questo:

isTodayOrFuture(YOUR_TEST_DATE_HERE)

1

Seleziona ieri per controllare i giorni passati o meno con l'aiuto di moment().subtract(1, "day");

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

Se vogliamo la differenza senza l'ora, puoi ottenere una data diversa (solo data senza ora) come di seguito, utilizzando il formato del momento.

Come, stavo affrontando il problema con la differenza mentre lo facevo;

moment().diff([YOUR DATE])

Quindi, è venuto con il seguente;

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

Non esitate a commentare se c'è qualcosa su cui migliorare.

Grazie,


3
Per favore, leggi Come scrivere una buona risposta . Le risposte di solo codice sono scoraggiate perché non spiegano come risolvono il problema. Dovresti aggiornare la tua risposta per spiegare cosa fa e come migliora le molte risposte che questa domanda ha già .
FluffyKitten,

0

lo volevo per qualcos'altro ma alla fine ho trovato un trucco che puoi provare

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

verificare con quanto segue:

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

sta tornando in pochi secondi ..

Se verificherà quindi come condizione di 2 minuti

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

0

La risposta più semplice sarà:

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

Verificherà con il valore di mezzanotte e restituirà un risultato accurato. Funzionerà anche quando la differenza oraria tra due date è inferiore a 24 ore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.