tickago
Version:
JavaScript library to calculate and compare elapsed time
1 lines • 2.57 kB
JavaScript
class TickAgo{static MINUTE_IN_SECONDS=60;static HOUR_IN_SECONDS=3600;static DAY_IN_SECONDS=86400;static MILLISECONDS_IN_SECOND=1e3;static cache=new Map;static MONTH_IN_SECONDS(t=new Date){let e=`month-${t.getFullYear()}-${t.getMonth()}`;if(this.cache.has(e))return this.cache.get(e);let i=new Date(t.getFullYear(),t.getMonth()+1,0).getDate(),N=i*this.DAY_IN_SECONDS;return this.cache.set(e,N),N}static YEAR_IN_SECONDS(t=new Date){let e=`year-${t.getFullYear()}`;if(this.cache.has(e))return this.cache.get(e);let i=t.getFullYear()%4==0&&t.getFullYear()%100!=0||t.getFullYear()%400==0,N=(i?366:365)*this.DAY_IN_SECONDS;return this.cache.set(e,N),N}static parseDate(t,e){if(t instanceof Date)return t;if(e&&"string"==typeof t){let i=t.match(/\d+/g);if(!i)throw Error("Invalid date format");let N={};e.split(/[-/.\s]/).forEach((t,e)=>N[t]=+i[e]);let s=new Date(N.YYYY,(N.MM||1)-1,N.DD||1);if(!isNaN(s.getTime()))return s}let S=new Date(t);if(!isNaN(S.getTime()))return S;throw Error("Invalid date format")}static moment(t,e={}){let i=new Date,N=this.parseDate(t,e.format),s=Math.floor((i-N)/this.MILLISECONDS_IN_SECOND),S=e.labels??{},{sec:o="sec ago",minutes:a="minutes ago",hours:r="hours ago",days:l="days ago",months:h="months ago",years:D="years ago"}=S,E=[{limit:this.MINUTE_IN_SECONDS,value:s,unit:o},{limit:this.HOUR_IN_SECONDS,value:Math.floor(s/this.MINUTE_IN_SECONDS),unit:a},{limit:this.DAY_IN_SECONDS,value:Math.floor(s/this.HOUR_IN_SECONDS),unit:r},{limit:this.MONTH_IN_SECONDS(N),value:Math.floor(s/this.DAY_IN_SECONDS),unit:l},{limit:this.YEAR_IN_SECONDS(N),value:Math.floor(s/this.MONTH_IN_SECONDS(N)),unit:h},];for(let{limit:I,value:O,unit:n}of E)if(s<I)return`${O} ${n}`;return`${Math.floor(s/this.YEAR_IN_SECONDS(N))} ${D}`}static compare(t,e,i){let N=this.parseDate(t,i),s=this.parseDate(e,i),S=Math.abs(s-N),o=S/this.MILLISECONDS_IN_SECOND,a=Math.floor(o/this.YEAR_IN_SECONDS(N)),r=o%this.YEAR_IN_SECONDS(N),l=Math.floor(r/this.MONTH_IN_SECONDS(N)),h=r%this.MONTH_IN_SECONDS(N),D=Math.floor(h/this.DAY_IN_SECONDS),E=h%this.DAY_IN_SECONDS,I=Math.floor(E/this.HOUR_IN_SECONDS),O=E%this.HOUR_IN_SECONDS,n=Math.floor(O/this.MINUTE_IN_SECONDS),C=Math.floor(O%this.MINUTE_IN_SECONDS);l>=12&&(a+=Math.floor(l/12),l%=12);let c={seconds:Math.floor(o),minutes:Math.floor(o/this.MINUTE_IN_SECONDS),hours:Math.floor(o/this.HOUR_IN_SECONDS),days:Math.floor(o/this.DAY_IN_SECONDS),months:12*a+l};return{years:a,months:l,days:D,hours:I,minutes:n,seconds:C,elapsedTime:S,raw:c}}}"undefined"!=typeof module&&module.exports?module.exports=TickAgo:window.TickAgo=TickAgo;