Wallogit.com
2017 © Pedro Peláez
Fancy date ranges for Moment.js., (*1)
Detailed API documentation can be found at: http://gf3.github.io/moment-range/DateRange.html, (*2)
, (*3)
Create a date range:, (*4)
``` javascript var start = new Date(2012, 0, 15); var end = new Date(2012, 4, 23); var range = moment.range(start, end);, (*5)
You can also create a date range with moment objects: ``` javascript var start = moment("2011-04-15", "YYYY-MM-DD"); var end = moment("2011-11-27", "YYYY-MM-DD"); var range = moment.range(start, end);
Arrays work too:, (*6)
``` javascript var dates = [moment("2011-04-15", "YYYY-MM-DD"), moment("2011-11-27", "YYYY-MM-DD")]; var range = moment.range(dates);, (*7)
You can also create a range from an [ISO 8601 time interval][interval] string: ``` javascript var timeInterval = "2015-01-17T09:50:04+00:00/2015-04-17T08:29:55+00:00"; var range = moment.range(timeInterval);
You can also create a range from the start until the end of a named interval:, (*8)
``` javascript var date = moment("2011-04-15", "YYYY-MM-DD"); var range = date.range("month");, (*9)
You can also create open-ended ranges which go to the earliest or latest possible date: ``` javascript var rangeUntil = moment.range(null, "2011-05-05"); var rangeFrom = moment.range("2011-03-05", null); var rangeAllTime = moment.range(null, null);
Check to see if your range contains a date/moment:, (*10)
``` javascript var start = new Date(2012, 4, 1); var end = new Date(2012, 4, 23); var lol = new Date(2012, 4, 15); var wat = new Date(2012, 4, 27); var range = moment.range(start, end); var range2 = moment.range(lol, wat);, (*11)
range.contains(lol); // true range.contains(wat); // false, (*12)
A optional second parameter indicates if the end of the range should be excluded when testing for inclusion ``` javascript range.contains(end) // true range.contains(end, false) // true range.contains(end, true) // false
Find out if your moment falls within a date range:, (*13)
``` javascript var start = new Date(2012, 4, 1); var end = new Date(2012, 4, 23); var when = moment("2012-05-10", "YYYY-MM-DD"); var range = moment.range(start, end);, (*14)
when.within(range); // true, (*15)
Does it overlap another range? ``` javascript range.overlaps(range2); // true
What are the intersecting ranges?, (*16)
``` javascript range.intersect(range2); // [moment.range(lol, end)], (*17)
Add/combine/merge overlapping ranges. ``` javascript range.add(range2); // [moment.range(start, wat)] var range3 = moment.range(new Date(2012, 3, 1), new Date(2012, 3, 15); range.add(range3); // [null]
Subtracting one range from another., (*18)
``` javascript range.subtract(range2); // [moment.range(start, lol)], (*19)
### Iterate Iterate over your date range by an amount of time or another range: ``` javascript var start = new Date(2012, 2, 1); var two = new Date(2012, 2, 2); var end = new Date(2012, 2, 5); var range1 = moment.range(start, end); var range2 = moment.range(start, two); // One day var acc = []; range1.by('days', function(moment) { // Do something with `moment` });
Any of the units accepted by moment.js' add
method may be used., (*20)
You can also iterate by another range:, (*21)
``` javascript
range1.by(range2, function(moment) {
// Do something with moment
acc.push(moment);
});, (*22)
acc.length == 5 // true, (*23)
Iteration also supports excluding the end value of the range by setting the last parameter to `true`. ``` javascript var acc = []; range1.by('d', function (moment) { acc.push(moment) }, true); acc.length == 4 // true
Compare range lengths or add them together with simple math:, (*24)
``` javascript var r_1 = moment.range(new Date(2011, 2, 5), new Date(2011, 3, 15)); var r_2 = moment.range(new Date(1995, 0, 1), new Date(1995, 12, 25));, (*25)
r_2 > r_1 // true, (*26)
r_1 + r_2 // duration of both ranges in milliseconds, (*27)
Math.abs(r_1 - r_2); // difference of ranges in milliseconds, (*28)
### Equality Check if two ranges are the same, i.e. their starts and ends are the same: ``` javascript var r_1 = moment.range(new Date(2011, 2, 5), new Date(2011, 3, 15)); var r_2 = moment.range(new Date(2011, 2, 5), new Date(2011, 3, 15)); var r_3 = moment.range(new Date(2011, 3, 5), new Date(2011, 6, 15)); r_1.isSame(r_2); // true r_2.isSame(r_3); // false
The difference of the entire range given various units., (*29)
Any of the units accepted by moment.js' add
method may be used., (*30)
``` javascript var start = new Date(2011, 2, 5); var end = new Date(2011, 5, 5); var dr = moment.range(start, end);, (*31)
dr.diff('months'); // 3 dr.diff('days'); // 92 dr.diff(); // 7945200000, (*32)
### Conversion #### `toArray` Converts the `DateRange` to an `Array` of `Date` objects. ``` javascript var start = new Date(2011, 2, 5); var end = new Date(2011, 5, 5); var dr = moment.range(start, end); dr.toArray('days'); // [new Date(2011, 2, 5), new Date(2011, 3, 5), new Date(2011, 4, 5), new Date(2011, 5, 5)]
toDateConverts the DateRange to an Array of the start and end Date objects., (*33)
``` javascript var start = new Date(2011, 2, 5); var end = new Date(2011, 5, 5); var dr = moment.range(start, end);, (*34)
dr.toDate(); // [new Date(2011, 2, 5), new Date(2011, 5, 5)], (*35)
#### `toString` Converting a `DateRange` to a `String` will format it as an [ISO 8601 time interval][interval]: ``` javascript var start = '2015-01-17T09:50:04+00:00'; var end = '2015-04-17T08:29:55+00:00'; var range = moment.range(moment.utc(start), moment.utc(end)); range.toString() // "2015-01-17T09:50:04+00:00/2015-04-17T08:29:55+00:00"
valueOfThe difference between the end date and start date in milliseconds., (*36)
``` javascript var start = new Date(2011, 2, 5); var end = new Date(2011, 5, 5); var range = moment.range(start, end);, (*37)
range.valueOf(); // 7945200000, (*38)
### Center Calculate the center of a range ``` javascript var start = new Date(2011, 2, 5); var end = new Date(2011, 3, 5); var dr = moment.range(start, end); dr.center(); // 1300622400000
Deep clone a range, (*39)
``` javascript var start = new Date(2011, 2, 5); var end = new Date(2011, 3, 5); var dr = moment.range(start, end);, (*40)
var dr2 = dr.clone(); dr2.start.add(2, 'days');, (*41)
dr2.start.toDate() === dr.start.toDate() // false, (*42)
## Installation moment-range works in both the browser and [node.js][node]. ### Node / NPM Install via npm: ``` sh npm install moment-range
And then require it:, (*43)
``` javascript var moment = require('moment'); require('moment-range');, (*44)
### Browser Simply include moment-range after moment.js: ``` html <script src="moment.js"></script> <script src="moment-range.js"></script>
Thanks to the fine people at cdnjs, you can link to moment-range from the cdnjs servers., (*45)
``` sh bower install moment-range, (*46)
**Note:** Include `moment-range` _after_ `moment`. ## Running Tests Clone this bad boy: ``` bash git clone https://git@github.com/gf3/moment-range.git
Install the dependencies:, (*47)
``` bash npm install, (*48)
Do all the things! ``` bash npm run-script build npm run-script test npm run-script jsdoc
moment-range is UNLICENSED., (*49)