331

I am trying to use momentjs to check if a given date is today or in the future.

This is what I have so far:

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

The code is evaluating my date (31st of Jan 2014) as a date in past.

Any idea what I am doing wrong?

Latheesan
  • 23,247
  • 32
  • 107
  • 201

18 Answers18

383

You can use the isSame function:

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

}
vvvvv
  • 25,404
  • 19
  • 49
  • 81
Wolf
  • 6,361
  • 2
  • 28
  • 25
  • 3
    does this match year and month too? – SuperUberDuper Mar 15 '16 at 20:48
  • 17
    It's must match year and month. moment('2010-01-01').isSame('2011-01-01', 'month'); // false, different year moment('2010-01-01').isSame('2010-02-01', 'day'); // false, different month – Wolf Mar 16 '16 at 03:08
  • 8
    This doesn't even answer the OP's question... "today OR IN THE FUTURE", and what is `startTime`? Date object don't have a `isSame` method... – Sharcoux Nov 07 '18 at 10:58
  • 8
    @Sharcoux This question is about momentjs, so clearly it is a moment object. – Nathan May 01 '19 at 19:39
256

After reading the documentation: http://momentjs.com/docs/#/displaying/difference/, you have to consider the diff function like a minus operator.

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

Therefore, you have to reverse your condition.

If you want to check that all is fine, you can add an extra parameter to the function:

moment().diff(SpecialTo, 'days') // -8 (days)
Aurélien Thieriot
  • 5,853
  • 2
  • 24
  • 25
219

Since no one seems to have mentioned it yet, the simplest way to check if a Moment date object is in the past:

momentObj.isBefore()

Or in the future:

momentObj.isAfter()

Just leave the args blank -- that'll default to now.

There's also isSameOrAfter and isSameOrBefore.

N.B. this factors in time. If you only care about the day, see Dipendu's answer.

mpen
  • 272,448
  • 266
  • 850
  • 1,236
  • 1
    The docs explain that this is undefined behaviour, so you should not do this: https://momentjs.com/docs/#/query/is-before/ – Dancrumb Jan 23 '18 at 23:43
  • 23
    @Dancrumb Read it again. "If nothing is passed to moment#isBefore, it will default to the current time." The `momentObj` in my example is an instance of a moment date. The docs are specifically talking about creating a new instance (current time) and then checking if it is in the past, in one statement. I'm **not** suggesting you do `moment().isBefore()` which is utterly pointless -- why would you check if *now* is in the past (or future)? – mpen Jan 23 '18 at 23:50
  • 4
    This is the best answer in my opinion, short, precise and effective. – Punter Bad Jul 24 '20 at 14:17
186
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');
Akis
  • 2,283
  • 1
  • 14
  • 15
94

You can use the isAfter() query function of momentjs:

Check if a moment is after another moment.

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

If you want to limit the granularity to a unit other than milliseconds, pass the units as the second parameter.

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/

Mo.
  • 26,306
  • 36
  • 159
  • 225
dbasch
  • 1,698
  • 1
  • 15
  • 31
  • The constructor that takes a date string is deprecated. – Vahid Amiri Aug 11 '16 at 01:33
  • @VahidAmiri The [docs](https://momentjs.com/docs/#/parsing/string/) don't mention this. They do however suggest we use [string + format](https://momentjs.com/docs/#/parsing/string-format/) constructor if we don't use [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). So unless one is using some weird date formats it is OK to use just a string. – johndodo Dec 24 '18 at 12:12
39

Update

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

I have since found the isSame function, which in I believe is the correct function to use for figuring out if a date is today.

Original answer

Just in case someone else needs this, just do this:

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

or if you want a function:

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

Where date is the date you want to check for.

Explanation

moment(0, "HH") returns today's day at midnight.

date1.diff(date2, "days") returns the number of days between the date1 and date2.

Francois Nadeau
  • 7,023
  • 2
  • 49
  • 58
33

invert isBefore method of moment to check if a date is same as today or in future like this:

!moment(yourDate).isBefore(moment(), "day");
Dipendu Paul
  • 2,685
  • 1
  • 23
  • 20
9

To check if it is today:

If we compare two dates which contain also the time information isSame will obviously fail. diff will fail in case that the two dates span over the new day:

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

I think the best way, even if it is not quick and short, is the following:

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

To check if it is in the future:

As suggested also by other users, the diff method works.

var isFuture = now.diff(anotherDate) < 0 
Emaborsa
  • 2,360
  • 4
  • 28
  • 50
8

If you only need to know which one is bigger, you can also compare them directly:

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

Hope this helps!

jsidera
  • 1,791
  • 1
  • 17
  • 19
5

Use the simplest one to check for future date

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");
Ali Adravi
  • 21,707
  • 9
  • 87
  • 85
5

I wrote functions that check if a date of Moment type is a Day that Passed or not, as functional and self-descriptive functions. Maybe it is could to help someone.

function isItBeforeToday(MomentDate: Moment) {
  return MomentDate.diff(moment(0, 'HH')) < 0;
}

function isItAfterToday(MomentDate: Moment) {
  return MomentDate.diff(moment(0, 'HH')) > 0;
}
uixprt
  • 71
  • 1
  • 8
4

if firstDate is same or after(future) secondDate return true else return false. Toda is 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;
  }

There is isSame, isBefore and isAfter for day compare moment example;

  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
  • 2,241
  • 27
  • 19
2

Select yesterday to check past days or not with help of moment().subtract(1, "day");

Reference:- 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.
  • 26,306
  • 36
  • 159
  • 225
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;
}

And then just use it line this :

isTodayOrFuture(YOUR_TEST_DATE_HERE)
Tanzeel
  • 455
  • 6
  • 16
2

If we want difference without the time you can get the date different (only date without time) like below, using moment's format.

As, I was facing issue with the difference while doing ;

moment().diff([YOUR DATE])

So, came up with following;

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

Please feel free to comment if there's anything to improve on.

Thanks,

Rajan Maharjan
  • 4,398
  • 2
  • 16
  • 26
  • 3
    Please review [How to write a good answer](https://stackoverflow.com/help/how-to-answer). Code-only answers are discouraged because they do not explain how they resolve the issue. You should update your answer to ***explain what this does and how it improves on the many answers this question already has***. – FluffyKitten Oct 14 '17 at 01:30
0

i wanted it for something else but eventually found a trick which you can try

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
  • 3,317
  • 1
  • 25
  • 29
0

check with following:

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

it is returning in seconds..

If will check as 2 mins condition then

if (isContinue < 120) {
  ..To check otp details or further logic
} else {
   // otp is getting invalid
}
Anupam Maurya
  • 1,927
  • 22
  • 26
0

Simplest answer will be:

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

It will check with the midnight value and will return an accurate result. It will work also when time diff between two dates is less than 24 hours also.

S K R
  • 552
  • 1
  • 3
  • 16