{"id":13548361,"url":"https://github.com/rotaready/moment-range","last_synced_at":"2025-05-14T03:08:51.347Z","repository":{"id":3374244,"uuid":"4421554","full_name":"rotaready/moment-range","owner":"rotaready","description":"Fancy date ranges for Moment.js","archived":false,"fork":false,"pushed_at":"2023-03-21T14:40:02.000Z","size":518,"stargazers_count":1689,"open_issues_count":49,"forks_count":199,"subscribers_count":36,"default_branch":"master","last_synced_at":"2025-04-10T19:53:08.858Z","etag":null,"topics":["date","date-time","javascript","moment","moment-range","node","time"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rotaready.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2012-05-23T15:09:16.000Z","updated_at":"2025-03-29T04:06:56.000Z","dependencies_parsed_at":"2022-09-01T08:11:44.709Z","dependency_job_id":null,"html_url":"https://github.com/rotaready/moment-range","commit_stats":{"total_commits":228,"total_committers":39,"mean_commits":5.846153846153846,"dds":0.5,"last_synced_commit":"498b2c3ba1fc44f8867f7f881854d3e6e8af84ea"},"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rotaready%2Fmoment-range","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rotaready%2Fmoment-range/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rotaready%2Fmoment-range/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rotaready%2Fmoment-range/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rotaready","download_url":"https://codeload.github.com/rotaready/moment-range/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253505570,"owners_count":21918934,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["date","date-time","javascript","moment","moment-range","node","time"],"created_at":"2024-08-01T12:01:09.349Z","updated_at":"2025-05-14T03:08:51.306Z","avatar_url":"https://github.com/rotaready.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# moment-range [![CircleCI](https://circleci.com/gh/rotaready/moment-range.svg?style=shield)](https://circleci.com/gh/rotaready/moment-range)\n\nFancy date ranges for [Moment.js][moment].\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n- [Installation](#installation)\n  - [Node / NPM](#node--npm)\n  - [Browser](#browser)\n  - [Older browsers and IE11](#older-browsers-and-ie11)\n- [Examples](#examples)\n  - [Create](#create)\n    - [rangeFromInterval](#rangefrominterval)\n    - [parseZoneRange](#parsezonerange)\n    - [rangeFromISOString](#rangefromisostring)\n  - [Attributes](#attributes)\n  - [Querying](#querying)\n    - [Adjacent](#adjacent)\n    - [Center](#center)\n    - [Contains](#contains)\n    - [Within](#within)\n    - [Overlaps](#overlaps)\n    - [Intersect](#intersect)\n    - [IsRange](#isrange)\n  - [Manipulation](#manipulation)\n    - [Add](#add)\n    - [Clone](#clone)\n    - [SnapTo](#snapto)\n    - [Subtract](#subtract)\n  - [Iteration](#iteration)\n    - [by](#by)\n    - [byRange](#byrange)\n    - [reverseBy](#reverseby)\n    - [reverseByRange](#reversebyrange)\n  - [Compare](#compare)\n    - [Equality](#equality)\n    - [Difference](#difference)\n  - [Conversion](#conversion)\n    - [`toDate`](#todate)\n    - [`toString`](#tostring)\n    - [`valueOf`](#valueof)\n- [Running Tests](#running-tests)\n- [Contributors](#contributors)\n- [License](#license)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n\n## Installation\n\nmoment-range works in both the browser and [node.js][node].\n\n### Node / NPM\n\nInstall via npm:\n\n``` sh\nnpm install --save moment-range\n```\n\n**ES6:**\n\n``` js\nimport Moment from 'moment';\nimport { extendMoment } from 'moment-range';\n\nconst moment = extendMoment(Moment);\n```\n\n**TypeScript:**\n\n``` js\nimport * as Moment from 'moment';\nimport { extendMoment } from 'moment-range';\n\nconst moment = extendMoment(Moment);\n```\n\n**CommonJS:**\n\n``` js\nconst Moment = require('moment');\nconst MomentRange = require('moment-range');\n\nconst moment = MomentRange.extendMoment(Moment);\n```\n\n### Browser\n\n``` html\n\u003cscript src=\"moment.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"moment-range.js\"\u003e\u003c/script\u003e\n```\n\n``` js\nwindow['moment-range'].extendMoment(moment);\n```\n\nThanks to the fine people at [cdnjs][cdnjs], you can link to moment-range from\nthe [cdnjs servers][cdnjs-moment-range].\n\n\n### Older browsers and IE11\n\nThis library makes use of `Symbol.iterator` to provide the [iteration\nprotocols] now that there is [broad support] for them, if you need to support\nolder browsers (specifically IE11) you will need to include a polyfill. Any of\nthe following should work, depending on your project configuration:\n\n* [babel runtime transform plugin]\n* [babel polyfill]\n* https://github.com/medikoo/es6-iterator\n* https://github.com/zloirock/core-js\n\n\n## Examples\n\n### Create\n\nCreate a date range:\n\n``` js\nconst start = new Date(2012, 0, 15);\nconst end   = new Date(2012, 4, 23);\nconst range = moment.range(start, end);\n```\n\nYou can also create a date range with moment objects:\n\n``` js\nconst start = moment('2011-04-15', 'YYYY-MM-DD');\nconst end   = moment('2011-11-27', 'YYYY-MM-DD');\nconst range = moment.range(start, end);\n```\n\nArrays work too:\n\n``` js\nconst dates = [moment('2011-04-15', 'YYYY-MM-DD'), moment('2011-11-27', 'YYYY-MM-DD')];\nconst range = moment.range(dates);\n```\n\nYou can also create a range from an [ISO 8601 time interval][interval] string:\n\n``` js\nconst timeInterval = '2015-01-17T09:50:04+00:00/2015-04-17T08:29:55+00:00';\nconst range = moment.range(timeInterval);\n```\n\nYou can also create a range from the start until the end of a named interval:\n\n``` js\nconst date = moment('2011-04-15', 'YYYY-MM-DD');\nconst range = date.range('month');\n```\n\nYou can also create open-ended ranges which go to the earliest or latest possible date:\n\n``` js\nconst rangeUntil = moment.range(null, '2011-05-05');\nconst rangeFrom = moment.range('2011-03-05');\nconst rangeAllTime = moment.range();\n```\nNote that any falsy value except 0 is treated as a missing date, resulting in an open-ended range.\n\n*Note:* Dates and moment objects both use a timestamp of 00:00:000 if none is\nprovided. To ensure your range includes any timestamp for the given end date,\nuse `.setHours(23,59,59,999)` when constructing a Date object, or\n`.endOf('day')` when constructing a moment object.\n\n#### rangeFromInterval\n\nYou can also create a range between an interval and a specified date. This accepts positive or negative values\nfor `count` and the date will default to _now_ if not provided.\n\n``` js\nconst interval = 'month';\nconst count = 4;\nconst date = moment('2017-07-20');\n\nconst range1 = moment.rangeFromInterval(interval, count, date);  // moment.range('2017-07-20', '2017-11-20')\nconst range2 = moment.rangeFromInterval('month', -2, date);      // moment.range('2017-05-20', '2017-07-20')\n```\n\nNote: The date can be provided as a Date, String, or Moment.\nWhen using a negative interval, the date provided will be set as the end of the range.\n\n#### parseZoneRange\n\n**DEPRECATED** in `4.0.0`: Replaced by `rangeFromISOString` to follow naming conventions.\n\n#### rangeFromISOString\n\nConverts an [ISO 8601 time interval string][interval] into a date range while\npreserving the time zones using [moment.parseZone][parseZone].\n\n``` js\nconst interval = '2015-01-17T09:50:00+03:00/2015-04-17T08:29:55-04:00';\nconst range = moment.rangeFromISOString(interval);\n\nrange.toString(); // '2015-01-17T09:50:00+03:00/2015-04-17T08:29:55-04:00'\n```\n\n### Attributes\n\nYou can access the start and end moments of the range easily enough:\n\n``` js\nconst start = new Date(2012, 0, 15);\nconst end   = new Date(2012, 4, 23);\nconst range = moment.range(start, end);\n\nrange.start  // moment\nrange.end  // moment\n```\n\n### Querying\n\nMany of the following examples make use of these moments:\n\n``` js\nconst a = moment('2016-03-10');\nconst b = moment('2016-03-15');\nconst c = moment('2016-03-29');\nconst d = moment('2016-04-01');\n```\n\n#### Adjacent\n\nCheck if two ranges are touching but not overlapping:\n\n``` js\n\nconst range1 = moment.range(a, b);\nconst range2 = moment.range(b, c);\nconst range3 = moment.range(c, d);\n\nrange1.adjacent(range2) // true\nrange1.adjacent(range3) // false\n```\n\n#### Center\n\nCalculate the center of a range:\n\n``` js\nconst start = new Date(2011, 2, 5);\nconst end   = new Date(2011, 3, 5);\nconst range = moment.range(start, end);\n\nrange.center(); // 1300622400000\n```\n\n#### Contains\n\nCheck to see if your range contains a date/moment. By default the start and end\ndates are included in the search. E.g.:\n\n``` js\nconst range = moment.range(a, c);\n\nrange.contains(a); // true\nrange.contains(b); // true\nrange.contains(c); // true\nrange.contains(d); // false\n```\n\nYou can also control whether the start or end dates should be excluded from the\nsearch with the `excludeStart` and `excludeEnd` options:\n\n``` js\nconst range = moment.range(a, c);\n\nrange.contains(a); // true\nrange.contains(a, { excludeStart: true }); // false\nrange.contains(c); // true\nrange.contains(c, { excludeEnd: true; }); // false\n```\n\n**DEPRECATED** in `4.0.0`: The `exclusive` options is used to indicate if the start/end of\nthe range should be excluded when testing for inclusion:\n\n**Note**: You can obtain the same functionality by setting `{ excludeStart:\ntrue, excludeEnd: true }`\n\n``` js\nrange.contains(c); // true\nrange.contains(c, { exclusive: false }); // true\nrange.contains(c, { exclusive: true }); // false\n```\n\n#### Within\n\nFind out if your moment falls within a date range:\n\n``` js\nconst range = moment.range(a, c);\n\nb.within(range); // true\n```\n\n#### Overlaps\n\nDoes it overlap another range?\n\n``` js\nconst range1 = moment.range(a, c);\nconst range2 = moment.range(b, d);\nrange1.overlaps(range2); // true\n```\n\nInclude adjacent ranges:\n\n``` js\nconst range1 = moment.range(a, b);\nconst range2 = moment.range(b, c);\n\nrange1.overlaps(range2)                      // false\nrange1.overlaps(range2, { adjacent: false }) // false\nrange1.overlaps(range2, { adjacent: true })  // true\n```\n\n#### Intersect\n\nWhat is the intersecting range?\n\n``` js\nconst range1 = moment.range(a, c);\nconst range2 = moment.range(b, d);\nrange1.intersect(range2); // moment.range(b, c)\n```\n\n#### IsRange\n\nIs it a Range?\n\n``` js\nmoment.isRange(range); // true\nmoment.isRange(IamNotRange); // false\n```\n\n### Manipulation\n\n#### Add\n\nAdd/combine/merge overlapping or adjacent ranges.\n\n``` js\nconst range1 = moment.range(a, c);\nconst range2 = moment.range(b, d);\nrange1.add(range2); // moment.range(a, d)\n\nconst range3 = moment.range(a, b);\nconst range4 = moment.range(c, d);\nrange3.add(range4); // null\n```\n\nInclude adjacent ranges:\n\n``` js\nconst range1 = moment.range(a, b);\nconst range2 = moment.range(b, c);\n\nrange1.add(range2); // null\nrange1.add(range2, { adjacent: false }); // null\nrange1.add(range2, { adjacent: true }); // moment.range(a, c)\n```\n\n#### Clone\n\nDeep clone a range\n\n``` js\nconst range1 = moment.range(a, d);\n\nconst range2 = range1.clone();\nrange2.start.add(2, 'days');\n\nrange1.start.toDate().getTime() === range2.start.toDate().getTime() // false\n```\n\n#### SnapTo\n\nSnap the start and end of a range to a given interval.\n\n``` js\nconst start = moment('2018-01-25 17:05:33');\nconst end = moment('2018-01-28 06:10:00');\n\nconst range1 = moment.range(start, end);\nconst range2 = range1.snapTo('day'); // 2018-01-25T00:00:00 -\u003e 2018-01-28T23:59:59\n\nrange1.diff('days'); // 2\nrange2.diff('days'); // 3\n```\n\n#### Subtract\n\nSubtracting one range from another.\n\n``` js\nconst range_ab = moment.range(a, b);\nconst range_bc = moment.range(b, c);\nconst range_cd = moment.range(c, d);\nconst range_ad = moment.range(a, d);\nrange_ad.subtract(range_bc); // [moment.range(a, b) moment.range(c, d)]\nrange_ac.subtract(range_bc); // [moment.range(a, b)]\nrange_ab.subtract(range_cd); // [moment.range(a, b)]\nrange_bc.subtract(range_bd); // [null]\n```\n\n### Iteration\n\nEach of the iteration methods returns an [Iterable][iterable], providing\na convenient and performant interface to iterating over your ranges by a given\nperiod.\n\n#### by\n\nIterate over your range by a given period. Any of the units accepted by\n[moment.js' `add` method][add] may be used. E.g.: `'years' | 'quarters'\n| 'months' | 'weeks' | 'days' | 'hours' | 'minutes' | 'seconds'\n| 'milliseconds'`\n\n``` js\nconst range = moment.range('2010-01-01', '2015-01-01');\n\nfor (let month of range.by('month')) {\n  month.format('YYYY-MM-DD');\n}\n\nconst years = Array.from(range.by('year'));\nyears.length == 6 // true\nyears.map(m =\u003e m.format('YYYY')) // ['2010', '2011', '2012', '2013', '2014', '2015']\n```\n\nIteration also supports excluding the final time slice of the range by setting the\n`excludeEnd` option to `true`. In the example below, the 5:00 -\u003e 6:00 time slice is omitted.\n\n``` js\nconst range = moment.range('2018-01-01 00:00', '2018-01-01 05:30');\n\nconst hours = Array.from(range.by('hour', { excludeEnd: true }));\nhours.length == 5 // true\nhours.map(m =\u003e m.format('HH:mm')) // ['00:00', '01:00', '02:00', '03:00', '04:00']\n```\n\nAdditionally it's possible to iterate by a given step that defaults to `1`:\n\n``` js\nconst start  = new Date(2012, 2, 2);\nconst end    = new Date(2012, 2, 6);\nconst range1 = moment.range(start, end);\n\nlet acc = Array.from(range1.by('day', { step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['02', '04', '06']\n\nacc = Array.from(range1.by('day', { excludeEnd: true, step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['02', '04']\n```\n\nYou can iterate over the span of a range for a period that is entered but not complete by using the [snapTo()](#snapto) method:\n\n``` js\nconst start = moment(\"2017-01-01T13:30:00\");\nconst end = moment(\"2017-01-05T01:45:12\");\nconst r1 = moment.range(start, end);\nconst r2 = r1.snapTo('day');\n\nArray.from(r1.by('days')).map(m =\u003e m.format('DD')); // ['01', '02', '03', '04']\nArray.from(r2.by('days')).map(m =\u003e m.format('DD')); // ['01', '02', '03', '04', '05']\n```\n\n**DEPRECATED** in `4.0.0`: The `exclusive` options is used to indicate if the\nend of the range should be excluded when testing for inclusion:\n\n**Note**: You can obtain the same functionality by setting `{ excludeEnd: true }`\n\n\n#### byRange\n\n``` js\nconst start = new Date(2012, 2, 1); // 1st\nconst two   = new Date(2012, 2, 2); // 2nd\nconst end   = new Date(2012, 2, 5); // 5th\nconst range1 = moment.range(start, end);\nconst range2 = moment.range(start, two); // One day\n```\n\nIterate by another range:\n\n``` js\nconst acc = Array.from(range1.byRange(range2));\n\nacc.length == 5 // true\nacc.map(m =\u003e m.format('DD')) // ['01','02','03','04','05']\n```\n\nExclude the end time slice:\n\n``` js\nconst acc = Array.from(range1.byRange(range2, { excludeEnd: true }));\n\nacc.length == 4 // true\nacc.map(m =\u003e m.format('DD')) // ['01','02','03','04']\n```\n\nBy step:\n\n``` js\nlet acc = Array.from(range1.byRange(range2, { step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['01', '03', '05']\n\nacc = Array.from(range1.byRange(range2, { excludeEnd, true, step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['01', '03']\n```\n\n**DEPRECATED** in `4.0.0`: The `exclusive` options is used to indicate if the\nend of the range should be excluded when testing for inclusion:\n\n**Note**: You can obtain the same functionality by setting `{ excludeEnd: true }`\n\n\n#### reverseBy\n\nIterate over a range in reverse:\n\n``` js\nconst range = moment.range('2012-01-01', '2015-01-01');\nconst acc = Array.from(range.reverseBy('years'));\nacc.map(m =\u003e m.format('YYYY')) // ['2015', '2014', '2013', '2012']\n```\n\nExclude the start time slice:\n\n``` js\nconst range = moment.range('2012-01-01', '2015-01-01');\nconst acc = Array.from(range.reverseBy('years', { excludeStart: true }));\nacc.map(m =\u003e m.format('YYYY')) // ['2015', '2014', '2013']\n```\n\nBy step:\n\n``` js\nconst start  = new Date(2012, 2, 2);\nconst end    = new Date(2012, 2, 6);\nconst range1 = moment.range(start, end);\n\nlet acc = Array.from(range1.reverseBy('day', { step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['06', '04', '02']\n\nacc = Array.from(range1.reverseBy('day', { excludeStart: true, step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['06', '04']\n```\n\n**DEPRECATED** in `4.0.0`: The `exclusive` options is used to indicate if the\nstart of the range should be excluded when testing for inclusion:\n\n**Note**: You can obtain the same functionality by setting `{ excludeStart: true }`\n\n\n#### reverseByRange\n\n``` js\nconst start = new Date(2012, 2, 1);\nconst two   = new Date(2012, 2, 2);\nconst end   = new Date(2012, 2, 5);\nconst range1 = moment.range(start, end);\nconst range2 = moment.range(start, two); // One day\n```\n\nIterate by another range in reverse:\n\n``` js\nconst acc = Array.from(range1.reverseByRange(range2));\n\nacc.length == 5 // true\nacc.map(m =\u003e m.format('DD')) // ['05', '04', '03', '02', '01']\n```\n\nExclude the start value:\n\n``` js\nconst acc = Array.from(range1.reverseByRange(range2, { excludeStart: true }));\n\nacc.length == 4 // true\nacc.map(m =\u003e m.format('DD')) // ['05', '04', '03', '02']\n```\n\nBy step:\n\n``` js\nlet acc = Array.from(range1.reverseByRange(range2, { step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['05', '03', '01']\n\nacc = Array.from(range1.reverseByRange(range2, { excludeStart: true, step: 2 }));\n\nacc.map(m =\u003e m.format('DD')) // ['05', '03']\n```\n\n**DEPRECATED** in `4.0.0`: The `exclusive` options is used to indicate if the\nstart of the range should be excluded when testing for inclusion:\n\n**Note**: You can obtain the same functionality by setting `{ excludeStart: true }`\n\n\n### Compare\n\nCompare range lengths or add them together with simple math:\n\n``` js\nconst range1 = moment.range(new Date(2011, 2, 5), new Date(2011, 3, 15));\nconst range2 = moment.range(new Date(1995, 0, 1), new Date(1995, 12, 25));\n\nrange2 \u003e range1 // true\n\nrange1 + range2 // duration of both ranges in milliseconds\n\nMath.abs(range1 - range2); // difference of ranges in milliseconds\n```\n\n#### Equality\n\nCheck if two ranges are the same, i.e. their starts and ends are the same:\n\n``` js\nconst range1 = moment.range(new Date(2011, 2, 5), new Date(2011, 3, 15));\nconst range2 = moment.range(new Date(2011, 2, 5), new Date(2011, 3, 15));\nconst range3 = moment.range(new Date(2011, 3, 5), new Date(2011, 6, 15));\n\nrange1.isSame(range2); // true\nrange2.isSame(range3); // false\n\nrange1.isEqual(range2); // true\nrange2.isEqual(range3); // false\n```\n\n#### Difference\n\nThe difference of the entire range given various units.\n\nAny of the units accepted by [moment.js' `add` method][add] may be used.\n\n``` js\nconst start = new Date(2011, 2, 5);\nconst end   = new Date(2011, 5, 5);\nconst range = moment.range(start, end);\n\nrange.diff('months'); // 3\nrange.diff('days');   // 92\nrange.diff();         // 7945200000\n```\n\nOptionally you may specify if the difference should not be truncated. By default it\nmimics moment-js' behaviour and truncates the values:\n\n``` js\nconst d1 = new Date(Date.UTC(2011, 4, 1));\nconst d2 = new Date(Date.UTC(2011, 4, 5, 12));\nconst range = moment.range(d1, d2);\n\nrange.diff('days')        // 4\nrange.diff('days', false) // 4\nrange.diff('days', true)  // 4.75\n```\n\n`#duration` is an alias for `#diff` and they may be used interchangeably.\n\n### Conversion\n\n#### `toDate`\n\nConverts the `DateRange` to an `Array` of the start and end `Date` objects.\n\n``` js\nconst start = new Date(2011, 2, 5);\nconst end   = new Date(2011, 5, 5);\nconst range = moment.range(start, end);\n\nrange.toDate(); // [new Date(2011, 2, 5), new Date(2011, 5, 5)]\n```\n\n#### `toString`\n\nConverting a `DateRange` to a `String` will format it as an [ISO 8601 time\ninterval][interval]:\n\n``` js\nconst start = '2015-01-17T09:50:04+00:00';\nconst end   = '2015-04-17T08:29:55+00:00';\nconst range = moment.range(moment.utc(start), moment.utc(end));\n\nrange.toString() // '2015-01-17T09:50:04+00:00/2015-04-17T08:29:55+00:00'\n```\n\n#### `valueOf`\n\nThe difference between the end date and start date in milliseconds.\n\n``` js\nconst start = new Date(2011, 2, 5);\nconst end   = new Date(2011, 5, 5);\nconst range = moment.range(start, end);\n\nrange.valueOf(); // 7945200000\n```\n\n## Running Tests\n\nClone this bad boy:\n\n``` sh\ngit clone https://git@github.com/rotaready/moment-range.git\n```\n\nInstall the dependencies:\n\n``` sh\nyarn install\n```\n\nDo all the things!\n\n``` sh\nyarn run check\nyarn run test\nyarn run lint\n```\n\n## Contributors\n\n- [**Adam Biggs**](https://github.com/adambiggs) (http://lightmaker.com)\n- [**Mats Julian Olsen**](https://github.com/mewwts)\n- [**Matt Patterson**](https://github.com/fidothe) (http://reprocessed.org/)\n- [**Wilgert Velinga**](https://github.com/wilgert) (http://neocles.io)\n- [**Tomasz Bak**](https://github.com/tb) (http://twitter.com/tomaszbak)\n- [**Stuart Kelly**](https://github.com/stuartleigh)\n- [**Jeremy Forsythe**](https://github.com/jdforsythe)\n- [**Александр Гренишин**](https://github.com/nd0ut)\n- [**@scotthovestadt**](https://github.com/scotthovestadt)\n- [**Thomas van Lankveld**](https://github.com/thomasvanlankveld)\n- [**nebel**](https://github.com/pronebel)\n- [**Kevin Ross**](https://github.com/rosskevin) (http://www.alienfast.com)\n- [**Thomas Walpole**](https://github.com/twalpole)\n- [**Jonathan Kim**](https://github.com/jkimbo) (http://jkimbo.co.uk)\n- [**Tymon Tobolski**](https://github.com/teamon) (http://teamon.eu)\n- [**Aristide Niyungeko**](https://github.com/aristiden7o)\n- [**Bradley Ayers**](https://github.com/bradleyayers)\n- [**Ross Hadden**](https://github.com/rosshadden) (http://rosshadden.github.com/resume)\n- [**Victoria French**](https://github.com/victoriafrench)\n- [**Jochen Diekenbrock**](https://github.com/JochenDiekenbrock)\n\n\n## License\n\nmoment-range is [UNLICENSED][unlicense].\n\n[add]: http://momentjs.com/docs/#/manipulating/add/\n[babel runtime transform plugin]: https://babeljs.io/docs/plugins/transform-runtime\n[babel polyfill]: https://babeljs.io/docs/usage/polyfill\n[broad support]: http://kangax.github.io/compat-table/es6/#test-well-known_symbols_Symbol.iterator,_existence_a_href=_https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator_title=_MDN_documentation_img_src=_../mdn.png_alt=_MDN_(Mozilla_Development_Network)_logo_width=_15_height=_13_/_/a_nbsp;\n[cdnjs]: https://github.com/cdnjs/cdnjs\n[cdnjs-moment-range]: https://cdnjs.com/libraries/moment-range\n[interval]: http://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n[iterable]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#Syntaxes_expecting_iterables\n[iteration protocols]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n[moment]: http://momentjs.com/\n[node]: http://nodejs.org/\n[unlicense]: http://unlicense.org/\n[parseZone]: https://momentjs.com/docs/#/parsing/parse-zone/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frotaready%2Fmoment-range","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frotaready%2Fmoment-range","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frotaready%2Fmoment-range/lists"}