# 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](https://cdn.hashnode.com/res/hashnode/image/upload/v1700219874772/0bb2eef8-4c10-4bc3-9ce3-f233a3e50c92.png align="left")](http://donamkhanh.com/wp-content/uploads/2015/12/Screen-Shot-2015-12-25-at-11.16.17-AM.png)

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](http://momentjs.com/) library which help us manipulate with datetime in Javascript very easy.

```javascript
$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?
