Brain Young
Brain Young

Reputation: 145

Determine if the date is today or is in the past using MomentJS?

Im building a mini calendar that just displays the current month, I have figured out how to map out the calendar, here is the code:

Code:

var month  = moment(),
    index  = 0,
    maxDay = month.daysInMonth(),
    start  = month.startOf("month"),
    offset = (start.isoWeekday() - 1 + 7) % 7; // start from monday

var week = []; // holds the weeks
var days = []; // holds the days

do {

  var dayIndex = index - offset;

  if(dayIndex >= 0 && dayIndex < maxDay){
    days.push({
              number: dayIndex + 1,
              isPast: null,  // stuck here boolean
              isToday: null  // stuck here boolean 
     })
  }

  if(index % 7 === 6){
    week.push(days);
    console.log(week);
    days = [];

     if (dayIndex + 1 >= maxDay) {
          break;
     }
  }

 index += 1;
} while(true);

This works fine, the only issue Im having is to figure out if the day is today or its in the past?

the code is here also: https://jsfiddle.net/chghb3Lq/3/

Upvotes: 4

Views: 8638

Answers (2)

VincenzoC
VincenzoC

Reputation: 31482

Moment has isBefore, isAfter and isSame functions to compare moments and as the docs says:

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


There are a couple of things in your code that you can achieve in a simple way using momentjs instead of reimplementing by yourself:

  • To loop from the first day of the month until the last day you can use:
  • Use date() to get date of the month (1-31)
  • Use day() to get day of the week (0 => Sunday, ... 6 => Saturday); or weekday() to get day of the week locale aware.

Using these suggestions your code could be like the following:

var day = moment().startOf('month');
var endOfMonth = moment().endOf('month');

var week = [];
var month = [];

while( day.isBefore(endOfMonth) ){
  week.push({
    number: day.date(),
    isPast: moment().isAfter(day, 'day'),
    isToday: moment().isSame(day, 'day')
  });
  if( day.day() === 0 ){
    month.push(week);
    week = [];
  }
  day.add(1, 'day');
}

console.log(month);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Upvotes: 2

charlietfl
charlietfl

Reputation: 171669

Use moment methods like isSame() , isBefore(), isSameOrBefore() etc.

They each allow setting comparison units like year month week day hour minute second

See Query Section of moment docs

Upvotes: 2

Related Questions