-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdecimaldate.min.js
1 lines (1 loc) · 2.74 KB
/
decimaldate.min.js
1
const decimaldate={};decimaldate.DECIMALPLACES=6;decimaldate.RE_YEARMONTHDAY=/^(\-?\+?)(\d+)\-(\d\d)\-(\d\d)$/;decimaldate.iso2dec=isodate=>{const datepieces=isodate.match(decimaldate.RE_YEARMONTHDAY);if(!datepieces)throw`Invalid date format ${isodate}`;[plusminus,yearstring,monthstring,daystring]=datepieces.slice(1);if(!decimaldate.isvalidmonth(monthstring)||!decimaldate.isvalidmonthday(yearstring,monthstring,daystring))throw`Invalid date ${isodate}`;let decbit=decimaldate.proportionofdayspassed(yearstring,monthstring,daystring);if(plusminus=="-")decbit=1-decbit;let yeardecimal=parseInt(yearstring)+decbit;if(plusminus=="-")yeardecimal*=-1;return parseFloat(yeardecimal.toFixed(decimaldate.DECIMALPLACES))};decimaldate.dec2iso=decdate=>{if(decdate>=0){yearint=parseInt(Math.abs(Math.floor(decdate)));plusminus=""}else{yearint=parseInt(Math.abs(Math.ceil(decdate)));plusminus="-"}const yearstring=yearint+"";const dty=decimaldate.daysinyear(yearstring);let targetday=dty*(Math.abs(decdate)%1);targetday=decdate>=0?Math.ceil(targetday):Math.floor(targetday);if(decdate<0)targetday=dty-targetday;const months=["01","02","03","04","05","06","07","08","09","10","11","12"];let monthstring;let dayspassed=0;for(var i=0,l=months.length;i<l;i++){monthstring=months[i];const dtm=decimaldate.daysinmonth(yearstring,monthstring);if(dayspassed+dtm<targetday){dayspassed+=dtm}else{break}}const daynumber=targetday-dayspassed;const daystring=(daynumber<10?"0":"")+daynumber;return`${plusminus}${yearstring}-${monthstring}-${daystring}`};decimaldate.isvalidmonth=monthstring=>{validmonths=["01","02","03","04","05","06","07","08","09","10","11","12"];return validmonths.indexOf(monthstring)!=-1};decimaldate.isvalidmonthday=(yearstring,monthstring,daystring)=>{days=parseInt(daystring);if(isNaN(days))return false;if(days<0)return false;const maxdays=decimaldate.daysinmonth(yearstring,monthstring);if(!maxdays||days>maxdays)return false;return true};decimaldate.proportionofdayspassed=(yearstring,monthstring,daystring)=>{let dayspassed=0;["01","02","03","04","05","06","07","08","09","10","11","12"].forEach(tms=>{if(tms<monthstring)dayspassed+=decimaldate.daysinmonth(yearstring,tms)});dayspassed+=parseInt(daystring);dayspassed-=1;dayspassed+=.5;const dty=decimaldate.daysinyear(yearstring);return dayspassed/dty};decimaldate.daysinmonth=(yearstring,monthstring)=>{monthdaycounts={"01":31,"02":28,"03":31,"04":30,"05":31,"06":30,"07":31,"08":31,"09":30,10:31,11:30,12:31};if(decimaldate.isleapyear(yearstring))monthdaycounts["02"]=29;return monthdaycounts[monthstring]};decimaldate.daysinyear=yearstring=>{return decimaldate.isleapyear(yearstring)?366:365};decimaldate.isleapyear=yearstring=>{yearnumber=parseInt(yearstring);const isleap=yearnumber%4==0&&(yearnumber%100!=0||yearnumber%400==0);return isleap};