The following code implements the Wikipedia calculation for sunrise and sunset at a given latitude and longitude. I wrote it after an OP published an incorrect version and asked for help.
It can be added to to compensate for elevation, etc- see web references. Results should be within a fraction of a minute, but assume clear horizon with no elevated land on the line-of-sight towards the Sun. Please note too that there are various different definitions of sunrise!!
The photo is a soft-focus of sunset at Rhosilli- one of my favourite places. Note the left-hand sun-dog- sign of stable air at high altitude carrying ice crystals. These optical effects are fascinating- see my programming example on how rainbows form, and also Flickr photos of Brockenspectre.
' ************************************ ' ** JDquery.bas ** ' ** Implemented from Wikipedia ** ' ************************************ ' >>>>>>>>>>>>>>>> NB calculations are at about 9sf <<<<<<<<<<<<<< mainwin 80 24 lonOmega = 0.0 ' Longitude ( West =+ve) of the observer in degrees. phi = 51.1 ' Latitude ( North =+ve) year = 2014.0 ' Gregorian version of 14 May 2014 at 00:00:00 month = 5.0 day = 20.0 hour = 12.0 ' This is the time JD refers to. minute = 0.0 second = 0.0 month$ ="JanFebMarAprMayJunJulAugSepOctNovDec" a =int( ( 14 -month) /12) y =year +4800 -a m =month +12 *a -3 print: print " Calculation is for Gregorian date and time of "; as2digits$( hour); ":"; as2digits$( minute); ":"; as2digits$( second); " on "; day; "/"; month; "/"; year; "..." ' JD is Julian Date, which is fractional. ( JDN is Julian Day Number and is an integer) ' >> I had 152 here... JD =day +int( ( 153 *m +2) /5) +365 *y +int( y /4) -int( y /100) +int( y /400) -32045_ +( hour -12) /24 +minute /1440 +second /86400 ' Current Julian Date as a fractional number print " .... so Julian date ( and time) is "; using( "########.######", JD) ' agrees with on-line calculator print "JD",, JD nStar =JD -2451545.0009 -lonOmega /360 n =int( nStar +1 /2) ' Current Julian Cycle since Jan 1st 2000 print "nstar, n",, nStar, n ' NB 'n' wasn't integered Jstar =2451545.0009 +lonOmega /360 +n ' Approx. Solar Noon at longitude specified print "Jstar",, Jstar M =( 357.5291 +0.98560028 *( Jstar -2451545)) mod 360 ' Solar Mean Anomaly in °. print "M",, M; "°." C =1.9148 *sinrad( M) +0.0200 *sinrad( 2 *M) +0.0003 *sinrad( 3 *M) ' Equation of Centre print "C",, C lambda =( M +102.9372 +C +180) mod 360 ' Ecliptic Longitude in °. print "lambda",, lambda; "°." Jtransit =Jstar +0.0053 *sinrad( M) -0.0069 *sinrad( 2 *lambda) ' Hour angle of Solar Transit ie of solar noon print "Jtransit",, Jtransit sind =sinrad( lambda) *sinrad( 23.45) delta =asn( sind) *57.29577951 ' Declination of the Sun in °. ' NB wasn't converting 'delta' to degrees print "sind", sind, print "delta", delta; "°." cosOmegaZero=( sinrad( -0.83) -sinrad( phi) *sind) /( cosrad( phi) *cosrad( delta)) print "cosOmegaZero", cosOmegaZero, omegaZero =acs( cosOmegaZero) *57.29577951 ' Hour angle in °. ' NB wasn't converting 'omegaZero' to degrees print "omegaZero", omegaZero; "°." Jset =2451545.0009 +( omegaZero +lonOmega) /360 +n +0.0053 *sinrad( M) -0.0069 *sinrad( 2 *lambda) Jrise =Jtransit -( Jset -Jtransit) print: print "Jrise, Jset", using( "#########.######", Jrise), using( "#########.######", Jset) print , timefromJD$( Jrise), timefromJD$( Jset) print print " *** OP said should be ***" print "Jrise, Jset 2456797.729167 2456798.361806" print print "Wolfram, when asked for 'sunrise 51.1N 0W 20 May 20.14' gave" +chr$( 13) +_ " Input interpretation: sunrise 51° 6´ N, 0° West, May 20 2014" +chr$( 13) +_ " Result: 5:04:52 am BST Tuesday, May 20, 2014" end ' ____________________________________________________________________ function timefromJD$( jd) jd = jd + 0.5 secs = int(( jd - int(jd)) * 24 * 60 * 60 + 0.5) mins = int( secs / 60) hour = int( mins / 60) timefromJD$ = date$( int( jd) - 2415386); " "; dig2$(hour); ":"; dig2$( mins mod 60); ":"; dig2$( secs mod 60) end function function dig2$(n) dig2$ = right$("0";n, 2) end function function as2digits$( x) as2digits$ =right$( "00" +str$( x), 2) end function function sinrad( th) sinrad =sin( th /57.29577951) end function function cosrad( th) cosrad =cos( th /57.29577951) end function function formattedTime$( H, M) formattedTime$ =right$( "00" +str$( H), 2); ":"; right$( "00" +str$( M), 2) end function
Calculation is for Gregorian date and time of 12:00:00 on 20/5/2014... .... so Julian date ( and time) is 2456798.000000 JD 2456798 nstar, n 5252.9991 5253 Jstar 2456798.0 M 134.888258°. C 1.33681713 lambda 59.162275°. Jtransit 2456798.0 sind 0.34168768 delta 19.9797298°. cosOmegaZero -0.47512187 omegaZero 118.367285°. Jrise, Jset 2456797.669783 2456798.327379 05/20/2014 04:04:29 05/20/2014 19:51:26