moment-date-math
Version:
This is a plugin to the Moment.js library to support date-math expression as a string to the moment object
105 lines (77 loc) • 4.88 kB
Markdown
# moment-date-math
**moment plugin to parse a date math, elasticsearch style**
This is a plugin to the Moment.js library to support date-math operations to the moment object. Date maths operations are inputted as a string whose format is based on elasticsearch date-math format (see <https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math>).
This plugin does not have any dependencies beyond Moment.js itself, and may be used in the browser and in Node.js.
English is not my mother-tongue, so please forgive any mistakes and the incomprehensive readme. Any help with this documentation or source code is appreciated and welcomed
---
## Installation
**Node.js**
`npm install moment-date-math`
**Bower and other package managers**
I haven't tested yet, but it should be similar to npm installation
**Browser**
`<script src="path/to/moment-date-math.js"></script>`
When using this plugin in the browser, be sure to include moment.js on your page first.
---
## Usage
### Module
To use this plugin as a module, use the `require` function:
```
require("moment-date-math");
```
Or replace your existing
```
var moment = require("moment");
```
by
```
var moment = require("moment-date-math");
```
-------------------------
## Example: (run at time zone +07:00)
```javascript
// the following 2 lines are equivalent:
moment.parseMath('2016-06-12 21:00:00Z||+1y2M3w-4d5h6m7s').format()
moment('2016-06-12 21:00:00Z').parseMath('+1y2M3w-4d5h6m7s').format()
// => moment('2016-06-12 21:00:00Z').add(1, 'y').add(2, 'M').add(3, 'w').subtract(4, 'd').subtract(5, 'h').subtract(6, 'm').subtract(7, 's').format()
// => 2017-08-29T22:53:53+07:00
```
```javascript
moment.parseMath('May 6th 2016 10:23:23[Z]+ 1M2d /d - 3h 4m', 'MMM Do Y hh:mm:ss').format()
// => moment('May 6th 2016 10:23:23', 'MMM Do Y hh:mm:ss').utcOffset('Z').add(1, 'M').add(2, 'd').startOf('day').subtract(3, 'h').subtract(4, 'm').format()
// => 2016-06-07T20:56:00Z
```
```javascript
// the following 2 lines are equivalent:
moment.parseMath('now[+05:00]-28h/d + 15d/M').format()
moment().calc('[+05:00]-28h/d + 15d/M').format()
// => moment().utcOffset('+05:00').subtract(28, 'h').startOf('day').add(15, 'd').startOf('month')
// => 2016-06-01T00:00:00+05:00
```
```javascript
moment.parseMath('2016-06-12 13:00:00 +05:00 [@]- 28 h /d + 15 d /M').format()
// => moment('2016-06-12 13:00:00 +05:00').utcOffset('2016-06-12 20:00:00 +05:00').subtract(28, 'h').startOf('day').add(15, 'd').startOf('month')
// => 2016-06-01T00:00:00+05:00
```
## Usage
(Convention: I use x? for an optional parameter x)
**moment.parseMath**(fullExpression, format?): create a moment from a dateMath expression and format
**moment().calc**(mathExpression): apply a dateMath expression to existing moment
#### *where*:
fullExpression = < datePart > + < splitter? > + < mathExpression >
* A splitter, if exists, must be '||'
* moment.parseMath(fullExpression, format?) is equivalent to moment(datePart, format?).calc(mathExpression), except for:
- the [@] operator, see below
- if < datePart > is 'now' or '' (empty string), in which case it is equivalent to moment().calc(mathExpression)
A mathExpression is a string composed by consecutive dateMath operators, with optional spaces between them. There are 4 type of operators:
- Set utcOffset operator: [@] or [Z] or [+XX:XX] or [-XX:XX], where each 'X' is a digit. It translates to the function call .utcOffset(<*whatever between the square brackets*>), with the exception of [@]
+ There should be at most 1 utcOffset operator, and if exists, it should be the first operator in the series
+ [@] should only be used in moment.parseMath, where the <datePart> contains a utc offset suffix, e.g: Z or +XX:XX. It translates to .utcOffset(< datePart >);
- Add operator: has the format of +< number1 >< unit1 >< number2 >< unit2 >...< number_n >< unit_n >. Add operator is space tolerant, i.e there can be whitespaces in between
+ The numbers are non-negative integers. Each unit is a character from the set [yMdhms]
+ It translates to .add(< number1 >, < unit1 >).add(< number2 >, < unit2 >)....add(< number_n >, < unit_n >)
- Subtract operator: similar to add operator but starts with a minus (-< number1 >< unit1 >< number2 >< unit2 >...< number_n >< unit_n >)
- startOf operator: has the format of /[yMdhms]
+ Consecutive startOf operators are not allowed (and it doesn't make sense)
+ It tranlates to .startOf(< fullUnitNotation >) where < fullUnitNotation > is 'year', 'month', 'day', 'hour', 'minute', 'second' respectively
I know, I'm not good at writing documents, nor at English. Help is appreciated. Hope you get the basic idea what this plugin is for, at least from the examples.