Date manipulation with moment.js

In my recent project, I have a filter as the image bellow:

Screen Shot 2015-12-25 at 11.16.17 AM

The period dropdown field have some options:

  • Today

  • Yesterday

  • Week to date

  • Last week

  • Month to date

  • Last month

and when you change the Period, the Date From and Date To should be changed with corresponding data.

For example, let's say today is 25/12/2015. So:

  • When we choose Today, the values will be 25/12/2015

  • When we choose Yesterday, the values will be 24/12/2015

  • When we choose Week to date, the values will be 21/12/2015 and 25/12/2015 respectively

  • When we choose Last week, the values will be 14/12/2015 and 20/12/2015 respectively

  • When we choose Month to date, the values will be 01/12/2015 and 25/12/2015 respectively

  • And finally, when we choose Last month, the values will be 01/11/2015 and 30/11/2015

If you implement this function by pure Javascript you may have some difficulty such as how to get the last day of specific month, how to get the begin & end date of a week...

Fortunately, we have moment.js library which help us manipulate with datetime in Javascript very easy.

$scope.filterPeriodChanged = function() {
    switch ($scope.filter.period) {
        case 'today':
            $scope.filter.dateFrom = moment().format('YYYY-MM-DD');
            $scope.filter.dateTo   = moment().format('YYYY-MM-DD');
            break;

        case 'yesterday':
            $scope.filter.dateFrom = moment().subtract(1, 'days').format('YYYY-MM-DD');
            $scope.filter.dateTo   = moment().subtract(1, 'days').format('YYYY-MM-DD');
            break;

        case 'weektodate':
            $scope.filter.dateFrom = moment().startOf('isoWeek').format('YYYY-MM-DD');
            $scope.filter.dateTo   = moment().format('YYYY-MM-DD');
            break;

        case 'lastweek':
            $scope.filter.dateFrom = moment().startOf('isoweek').subtract(1, 'days').startOf('isoWeek').format('YYYY-MM-DD');
            $scope.filter.dateTo   = moment().startOf('isoweek').subtract(1, 'days').endOf('isoWeek').format('YYYY-MM-DD');
            break;

        case 'monthtodate':
            $scope.filter.dateFrom = moment().startOf('month').format('YYYY-MM-DD');
            $scope.filter.dateTo   = moment().format('YYYY-MM-DD');
            break;

        case 'lastmonth':
            $scope.filter.dateFrom  = moment().subtract(1, 'month').startOf('month').format('YYYY-MM-DD');
            $scope.filter.dateTo    = moment().subtract(1, 'month').endOf('month').format('YYYY-MM-DD');
            break;

        default: // All
            $scope.filter.dateFrom = null;
            $scope.filter.dateTo   = null
            break;
    }
};

The above requirements can be done by small line of codes (in my case, I use AngularJS)

Much easier, right?