spacetime-daylight
Version:
calculate approximate sunlight times for a given timezone
2 lines (1 loc) • 5.37 kB
JavaScript
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("spacetime-geo")):"function"==typeof define&&define.amd?define(["spacetime-geo"],n):(t="undefined"!=typeof globalThis?globalThis:t||self).spacetimeDaylight=n(t.spacetimeGeo)}(this,(function(t){"use strict";var n=function(t,n){return t(n={exports:{}},n.exports),n.exports}((function(t,n){!function(){var n=Math.PI,e=Math.sin,i=Math.cos,r=Math.tan,o=Math.asin,u=Math.atan2,s=Math.acos,a=n/180,c=864e5,d=2440588,f=2451545;function h(t){return new Date((t+.5-d)*c)}function l(t){return function(t){return t.valueOf()/c-.5+d}(t)-f}var p=23.4397*a;function m(t,n){return u(e(t)*i(p)-r(n)*e(p),i(t))}function g(t,n){return o(e(n)*i(p)+i(n)*e(p)*e(t))}function M(t,n,o){return u(e(t),i(t)*e(n)-r(o)*i(n))}function v(t,n,r){return o(e(n)*e(r)+i(n)*i(r)*i(t))}function w(t,n){return a*(280.16+360.9856235*t)-n}function y(t){return a*(357.5291+.98560028*t)}function D(t){return t+a*(1.9148*e(t)+.02*e(2*t)+3e-4*e(3*t))+102.9372*a+n}function P(t){var n=D(y(t));return{dec:g(n,0),ra:m(n,0)}}var T={getPosition:function(t,n,e){var i=a*-e,r=a*n,o=l(t),u=P(o),s=w(o,i)-u.ra;return{azimuth:M(s,r,u.dec),altitude:v(s,r,u.dec)}}},k=T.times=[[-.833,"sunrise","sunset"],[-.3,"sunriseEnd","sunsetStart"],[-6,"dawn","dusk"],[-12,"nauticalDawn","nauticalDusk"],[-18,"nightEnd","night"],[6,"goldenHourEnd","goldenHour"]];T.addTime=function(t,n,e){k.push([t,n,e])};var b=9e-4;function x(t,e,i){return b+(t+e)/(2*n)+i}function I(t,n,i){return f+t+.0053*e(n)-.0069*e(2*i)}function H(t,n,r,o,u,a,c){var d=function(t,n,r){return s((e(t)-e(n)*e(r))/(i(n)*i(r)))}(t,r,o);return I(x(d,n,u),a,c)}function z(t){var n=a*(134.963+13.064993*t),r=a*(93.272+13.22935*t),o=a*(218.316+13.176396*t)+6.289*a*e(n),u=5.128*a*e(r),s=385001-20905*i(n);return{ra:m(o,u),dec:g(o,u),dist:s}}function S(t,n){return new Date(t.valueOf()+n*c/24)}T.getTimes=function(t,e,i,r){var o,u,s,c,d,f=a*-i,p=a*e,m=function(t){return-2.076*Math.sqrt(t)/60}(r=r||0),M=function(t,e){return Math.round(t-b-e/(2*n))}(l(t),f),v=x(0,f,M),w=y(v),P=D(w),T=g(P,0),z=I(v,w,P),S={solarNoon:h(z),nadir:h(z-.5)};for(o=0,u=k.length;o<u;o+=1)d=z-((c=H(((s=k[o])[0]+m)*a,f,p,T,M,w,P))-z),S[s[1]]=h(d),S[s[2]]=h(c);return S},T.getMoonPosition=function(t,n,o){var s=a*-o,c=a*n,d=l(t),f=z(d),h=w(d,s)-f.ra,p=v(h,c,f.dec),m=u(e(h),r(c)*i(f.dec)-e(f.dec)*i(h));return p+=function(t){return t<0&&(t=0),2967e-7/Math.tan(t+.00312536/(t+.08901179))}(p),{azimuth:M(h,c,f.dec),altitude:p,distance:f.dist,parallacticAngle:m}},T.getMoonIllumination=function(t){var n=l(t||new Date),r=P(n),o=z(n),a=149598e3,c=s(e(r.dec)*e(o.dec)+i(r.dec)*i(o.dec)*i(r.ra-o.ra)),d=u(a*e(c),o.dist-a*i(c)),f=u(i(r.dec)*e(r.ra-o.ra),e(r.dec)*i(o.dec)-i(r.dec)*e(o.dec)*i(r.ra-o.ra));return{fraction:(1+i(d))/2,phase:.5+.5*d*(f<0?-1:1)/Math.PI,angle:f}},T.getMoonTimes=function(t,n,e,i){var r=new Date(t);i?r.setUTCHours(0,0,0,0):r.setHours(0,0,0,0);for(var o,u,s,c,d,f,h,l,p,m,g,M,v,w=.133*a,y=T.getMoonPosition(r,n,e).altitude-w,D=1;D<=24&&(o=T.getMoonPosition(S(r,D),n,e).altitude-w,l=((d=(y+(u=T.getMoonPosition(S(r,D+1),n,e).altitude-w))/2-o)*(h=-(f=(u-y)/2)/(2*d))+f)*h+o,m=0,(p=f*f-4*d*o)>=0&&(g=h-(v=Math.sqrt(p)/(2*Math.abs(d))),M=h+v,Math.abs(g)<=1&&m++,Math.abs(M)<=1&&m++,g<-1&&(g=M)),1===m?y<0?s=D+g:c=D+g:2===m&&(s=D+(l<0?M:g),c=D+(l<0?g:M)),!s||!c);D+=2)y=u;var P={};return s&&(P.rise=S(r,s)),c&&(P.set=S(r,c)),s||c||(P[l>0?"alwaysUp":"alwaysDown"]=!0),P},t.exports=T}()}));function e(t){return t*(180/Math.PI)}const i=3155706e4,r=145075962e4,o=function(t){let n=null;n=t.epoch>r?function(t){let n=148231668e4;for(;n<t;)n+=i;return n}(t.epoch):function(t){let n=141920256e4;for(;n>t;)n-=i;return n}(t.epoch);let e=t.set(n);e.year()<t.year()&&(e=e.set(e.epoch+i)),e.year()>t.year()&&(e=e.set(e.epoch-i));let o=e.set(e.epoch-1585566e4);return{winter:e,summer:o}},u=function(e,i,r,o){if(void 0===i||void 0===r){let t=e.point();i=t.lat,r=t.lng}e.in=e.in||t.in,e=e.in(i,r);let u=new Date(e.epoch);return function(t,n){let e=new Date(n);return(t=t.clone()).epoch=e.getTime(),t}(e,n.getTimes(u,i,r)[o])};return{in:t.in,point:t.point,solstice:function(){return o(this)},winterSolstice:function(){return o(this).winter},summerSolstice:function(){return o(this).summer},sunPosition:function(i,r){return function(i,r,o){if(void 0===r||void 0===o){let t=i.point();r=t.lat,o=t.lng}if(!r||!o)return{};i.in=i.in||t.in,i=i.in(r,o);let u=new Date(i.epoch),s=n.getPosition(u,r,o);return{azimuth:e(s.azimuth),altitude:e(s.altitude)}}(this,i,r)},sunrise:function(t,n){return u(this,t,n,"sunrise")},sunset:function(t,n){return u(this,t,n,"sunset")},noon:function(t,n){return u(this,t,n,"solarNoon")},dawn:function(t,n){return u(this,t,n,"dawn")},dusk:function(t,n){return u(this,t,n,"dusk")},daylight:function(t,n){let e=this.sunrise(t,n),i=this.sunset(t,n),r=i.since(e),o={hours:r.diff.hours,minutes:r.diff.minutes,seconds:r.diff.seconds},u=e.diff(i);u.seconds=parseInt((i.epoch-e.epoch)/1e3,10);let s=e.diff(this);s.seconds=parseInt((this.epoch-e.epoch)/1e3,10);let a=s.seconds/u.seconds,c="day",d=this.dawn(),f=this.dusk();return a<0?(a=0,c=this.epoch>d.epoch?"dawn":"night"):a>1&&(a=0,c=this.epoch<f.epoch?"dusk":"night"),{dawn:d.time(),sunrise:e.time(),sunset:i.time(),dusk:f.time(),duration:{inHours:u.hours,inMinutes:u.minutes,inSeconds:u.seconds,human:o},current:{progress:a,status:c}}}}}));