Skip to content

Instantly share code, notes, and snippets.

@tamirazrab
Forked from RienNeVaPlus/dateDiff.ts
Created October 10, 2021 18:48
Show Gist options
  • Select an option

  • Save tamirazrab/1021720b77a7448c72a7de72592f0d1e to your computer and use it in GitHub Desktop.

Select an option

Save tamirazrab/1021720b77a7448c72a7de72592f0d1e to your computer and use it in GitHub Desktop.
πŸ•€ dateDiff() - returns a detail object about the difference between two dates
/**
* β˜ƒ dateDiff "Snowman Carl" (http://stackoverflow.com/questions/13903897)
* Returns a detail object about the difference between two dates
*
* When providing custom units, provide them in descending order (eg week,day,hour; not hour,day,week)
*
* @param {Date} dateStart - date to compare to
* @param {Date|string} [dateEnd=new Date()] - second date, can be used as unit param instead
* @param {...string} [units=Object.keys(dateDiffDef)] - limits the returned object to provided keys
*/
export function dateDiff(
dateStart: Date,
dateEnd: Date | string = new Date,
...units: string[]
): {
[key: string]: number
} {
if(typeof dateEnd === 'string')
dateEnd = new Date();
let delta: number = Math.abs(dateStart.getTime() - dateEnd.getTime());
return (units.length ? units : Object.keys(dateDiffDef))
.reduce((res: object, key: string) => {
if(!dateDiffDef.hasOwnProperty(key))
throw new Error('Unknown unit in dateDiff: '+key);
res[key] = Math.floor(delta / dateDiffDef[key]);
delta -= res[key] * dateDiffDef[key];
return res;
}, {});
}
// default time units for dateDiff
export const dateDiffDef = {
millennium: 31536000000000,
century: 3153600000000,
decade: 315360000000,
year: 31536000000,
quarter: 7776000000,
month: 2592000000,
week: 604800000,
day: 86400000,
hour: 3600000,
minute: 60000,
second: 1000,
millisecond: 1
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment