Node/Js-module for parsing and making sense of ISO8601-durations
Durations in ISO8601 comes in two formats:
PnYnMnDTnHnMnS
-P<date>T<time>
Then
is replaced by the value for each of the date and time elements that follow then
.
Leading zeros are not requiredPnW
- the week format
Check out the details on Wikipedia
$ npm install iso8601-duration
Most noteworthy of the interface is the ability to provide a date
for toSeconds
-calculations.
Why becomes evident when working with durations that span dates as all months are not equally long.
E.g January of 2016 is 744 hours compared to the 696 hours of February 2016.
If a date is not provided for toSeconds
the timestamp Date.now()
is used as baseline.
export const toSeconds; // fn = (obj, date?) => number
export const pattern; // ISO8601 RegExp
export const parse; // fn = string => obj
export default {
toSeconds,
pattern,
parse
}
Simple usage
import {parse, end, toSeconds, pattern} from 'iso8601-duration';
console.log(parse('P1Y2M4DT20H44M12.67S'));
/* outputs =>
{
years: 1,
months: 2,
days: 4,
hours: 20,
minutes: 44,
seconds: 12.67
}
*/
console.log( toSeconds( parse('PT1H30M10.5S') ) );
// outputs => 5410.5
console.log ( end( parse('P1D') ) );
// outputs => DateObj 2017-10-04T10:14:50.190Z
A more complete usecase / example
import {parse, toSeconds, pattern} from 'iso8601-duration';
// convert iso8601 duration-strings to total seconds from some api
const getWithSensibleDurations = someApiEndpoint => {
// return promise, like fetch does
return new Promise(resolve => {
// fetch text
fetch(someApiEndpoint)
.then(res => res.text())
.then(jsonString => {
// create new pattern that matches on surrounding double-quotes
// so we can replace the string with an actual number
const replacePattern = new RegExp(`\\"${pattern.source}\\"`, 'g');
jsonString = jsonString.replace(replacePattern, m => {
return toSeconds(parse(m));
});
// resolve original request with sensible durations in object
resolve( JSON.parse(jsonString) );
});
});
}