j'avais besoin de calculer l'équation du temps
c'est quand même compliqué... avec pas mal de prises de tête...
comme c'était plus simple avec le code java script de l'honorable Larry Bogan.
voilà le code en PureBasic, Si ça intéresse quelqu'un..
Attention pour vérifié avec son site,
Celui-ci donne des valeurs EQT inversées en polarité et sont en décimales.
Exemple du code pour le 3/10/2012 donne l' EQT en positif sur son site.
alors que nous sommes en Europe avec ces valeurs négatives.
car vu du Continent Américain, l’Europe se trouve à l'est.
Cordialement
[code mis à jour]
Code : Tout sélectionner
;#####################################################################################################
; Conversion du code de larry Bogan pour le calcul de l'équation du temps
; http://www.nature1st.net/bogan/astro/time/jsjdetst.html
; adapter du javascript vers PureBasic par kernadec (10/2012)
;#####################################################################################################
Procedure.d Frac(Xfrac.d)
ProcedureReturn Xfrac-Int(Xfrac)
EndProcedure
Procedure.d dms(Xdms.d)
;conversion decimales en degres minutes secondes
ProcedureReturn Int(Xdms)+Frac(Int(Frac(Xdms)*60)/100)+Frac(Frac(Frac(Xdms)*60)*0.006)
EndProcedure
Procedure.d dec(xdec.d)
;conversion degres minutes secondes en decimales
ProcedureReturn Int(Xdec)+Int(frac(Xdec)*100)/60+(frac(Xdec)*100-Int(frac(Xdec)*100))*100/3600
EndProcedure
Procedure.d calcJD(year.l,month.l,day.l,time.d,tzone)
y.d = year
m.d = month
d.d = day
t.d = dec(time.d)
If m <= 2
y = y - 1
m = m + 12
EndIf
a.d = Round((y/100),#PB_Round_Down)
b.d = 2 - a + Round((a/4),#PB_Round_Down)
d.d + (t/24)
jdg.d = Round((365.25*(y+4716)),#PB_Round_Down)+Round((30.6001*(m+1)),#PB_Round_Down)+d+b-1524.5
;// Correct the time For UT from local standard time - this only sets up calc To give the right jd For 0h UT
jdg -(tzone/24)-(t/24)
jd0.d = Round((jdg+0.5),#PB_Round_Nearest)-0.5
;// Julian day 0h UT
ProcedureReturn jd0
EndProcedure
Procedure longcorr(longitude.d)
lngtd.d = dec(longitude)
tzone.l = Round((lngtd/15),#PB_Round_Up)
ProcedureReturn tzone
EndProcedure
Procedure.d calcET(jday.d)
radian0.d = 180/#PI
Tz.d = (jday-2451545.0)/36525 ; Julian (jours depuis le 1 janvier 2000 2451545 +)
tau.d = Tz/10
obl.d=23.439291-0.001300*Tz ; 23.439291 déclinaison du soleil le 1 janvier 2000
obl=obl/radian0
L.d = 280.46644567+360007.6982779*tau+0.030320*tau*tau+Pow(tau,3)/49931-Pow(tau,4)/15299
L = L/radian0
M.d = 357.052910+35999.05030*Tz-0.0001559*Tz*Tz-0.00000048*Tz*Tz*Tz
M = M/radian0
e.d = 0.01670617-0.000042037*Tz-0.0000001236*Tz*Tz
y.d = Pow(Tan(obl/2),2)
ET.d = y*Sin(2*L)-2*e*Sin(M)+4*e*y*Sin(M)*Cos(2*L)-y*y/2*Sin(4*L)
ET = ET*radian0*4
;// inversion polarité (est-ouest) pour l'europe par rapport continent americain
If ET>0:ET=0-ET:Else:ET=Abs(ET):EndIf
ProcedureReturn ET
EndProcedure
Procedure.s calcST(jdi.d,tzone,longitude)
;// calculate the siderial time at Greenwich in degrees at 0hUT
t1.d = (jdi-2451545.0)/36525;
st.d = 100.46061837+36000.77053608*t1+0.000387933*t1*t1-t1*t1*t1/38710000;
;// correct For other time And time zone
;// remember that julian day is For 0h UT (add in time plus time zone (negative =west))
;// The following gives the UT For the time, t in time zone tzone
ut.d = (dec(time)+tzone)
;// example If tzone = -4 hours And time = 15 hours (3 pm) then UT = 15+4 = 19 hours (remember st is in degrees)
st = st + 1.002738*ut*15
;// Now calculate local siderial time which is your longitude less than the st at greenwich
;st = st+dec(longitude) ; utiliser cette addition si l'on veut ajouter le fuseau horaire pour temps sidéral local
;// Reduce the angle To 0-360
If st < 0
n = Round(Abs(st/360),#PB_Round_Down)
st + ((n+1)*360)
EndIf
hr = Round((st/15),#PB_Round_Down)
mn = Round((Mod(st,15)*4),#PB_Round_Down);
sc = Round(((st-(hr*15)-(mn/4))*240),#PB_Round_Nearest)
If hr > 24
n = Round((hr/24),#PB_Round_Down)
hr = hr - n*24
EndIf
sideral$ = ""+Str(hr)+"h"+Str(mn)+"m"+Str(sc)+"s"
ProcedureReturn sideral$
EndProcedure
year.l=2012
month.l=10
day.l=3
time.d=0 ;hms
longitude.d=0 ;degres (ouest = long négative)
tzhr.l = longcorr(longitude.d);
;// returns the julian day For 0h UT
julian0.d=calcJD(year.l,month.l,day.l,time.d,tzhr)
;// julian day For the local time
jd1.d = julian0+((dec(time)+tzhr)/24)
If (dec(time)+tzhr)>=24
jd1 - 1
EndIf
EQT.d=calcET(jd1.d)
ts$=calcST(jd1.d,tzone,longitude)
Debug "julian0= " + StrD(julian0,2)
Debug "tzone= " + Str(tzhr)
Debug "julian= " + StrD(jd1,2)
Debug "EQ-Temps= " + StrD(dms(EQT),8)
Debug "Temps Sidéral= " + ts$
Debug "resultats"