const minute = 60; | |
const hour = minute * 60; | |
const day = hour * 24; | |
const week = day * 7; | |
const year = day * 365.25; | |
const REGEX = /^(\+|\-)? ?(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i; | |
export default (str) => { | |
const matched = REGEX.exec(str); | |
if (!matched || (matched[4] && matched[1])) { | |
throw new TypeError('Invalid time period format'); | |
} | |
const value = parseFloat(matched[2]); | |
const unit = matched[3].toLowerCase(); | |
let numericDate; | |
switch (unit) { | |
case 'sec': | |
case 'secs': | |
case 'second': | |
case 'seconds': | |
case 's': | |
numericDate = Math.round(value); | |
break; | |
case 'minute': | |
case 'minutes': | |
case 'min': | |
case 'mins': | |
case 'm': | |
numericDate = Math.round(value * minute); | |
break; | |
case 'hour': | |
case 'hours': | |
case 'hr': | |
case 'hrs': | |
case 'h': | |
numericDate = Math.round(value * hour); | |
break; | |
case 'day': | |
case 'days': | |
case 'd': | |
numericDate = Math.round(value * day); | |
break; | |
case 'week': | |
case 'weeks': | |
case 'w': | |
numericDate = Math.round(value * week); | |
break; | |
default: | |
numericDate = Math.round(value * year); | |
break; | |
} | |
if (matched[1] === '-' || matched[4] === 'ago') { | |
return -numericDate; | |
} | |
return numericDate; | |
}; | |