Une petite application regroupant plusieurs fonctions collectées par Jean Meeus(source : Astronomical algorithms).
Remarques:
L'utilisation des gadgets est un peu rustique mais je les utilise pas souvent![]()
Je n'ai pas utilisé le gadget calendrier car les dates peuvent aller jusqu'à l'an -4712
Les dates négatives sont acceptées mais...Pour tenir compte des heures, mettre les jours sous forme décimale
Exemple 12.25/4/2005 correspond au 12 avril 2005 à 6h du matin
Le zéro est facultatif "05" et "5" sont acceptés
Ne pas oublier de valider avec "/" quand on rentre un nombre de jours dans le dernier cadre
Les valeurs proposées dans le livre pour vérifier l'implémentation correspondent aux calculs avec le calendrier julien (c'est à dire la variable b=0 voir code)Je n'arrive pas à savoir sur quels critères il décide de la nature de la date (julienne ou grégorienne).;dans le calendrier julien prendre b=0
jd=Int(365.25*(y+4716))+Int(30.6001*(m+1))+d+b-1524.5
Il propose une trentaine de dates pour la vérification, les positives correspondent au calcul "grégorien", les négatives au "julien".
Exemple: 1.5/1/-4712 correspond au jour julien 0 (d'après livre)
Cette valeur est obtenue uniquement avec b=0
Comme les calculs sont faits dans le calendrier grégorien, je n'ai pas mis le calcul des années bissextiles pour le calendrier julien (si quelqu'un en veut, je le rajouterai!)
Code : Tout sélectionner
;******************************************
;quelques utilisations du jour julien
;*****************************************
;auteur Huitbit
;pb v4.02
;tiré du livre de Jean Meeus, "astronomical algorithms"
;définition wikipédia
;Le jour julien (JJ ou JD en anglais pour Julian Day) est le temps qui s'est écoulé depuis midi du 1er janvier 4713 av. J.-C. selon
;le calendrier julien proleptique ou le 24 novembre 4714 av. J.-C. selon le calendrier grégorien proleptique, exprimé en jours décimaux.
;La partie entière spécifie jour et la partie décimale spécifie l'heure: 0,5 correspondant au « minuit » du jour en question.
;.......................................................................................................................
Enumeration
#gadget_texte_premiere_date
#gadget_texte_deuxieme_date
#gadget_premiere_date
#gadget_deuxieme_date
#gadget_jour_julien_premiere_date
#gadget_jour_julien_deuxieme_date
#gadget_texte_intervalle_de_temps_en_jours
#gadget_intervalle_de_temps_en_jours
EndEnumeration
jd1.f=0
jd2.f=0
Procedure.f calcul_date_jourjulien(date_saisie.s)
y.f=Val(StringField(date_saisie,3,"/"));year
m.f=Val(StringField(date_saisie,2,"/"));month
d.f=ValF(StringField(date_saisie,1,"/"));day
a.f=0 ;intermédiaire de calcul
b.f=0 ;intermédiaire de calcul
jd.f=0; julian day
;***calcul du jour julien***
If m=1 Or m=2
y=y-1
m=m+12
EndIf
;calculs dans le calendrier grégorien (le notre actuellement)
a=Int(y/100)
b=2-a+Int(a/4)
;dans le calendrier julien prendre b=0
jd=Int(365.25*(y+4716))+Int(30.6001*(m+1))+d+b-1524.5
;***fin calcul du jour julien***
ProcedureReturn jd
EndProcedure
Procedure.s calcul_jourjulien_date(jd.f)
z.f=0;partie entière du jd
f.f=0;partie décimale du jd
alpha.f=0;intermédiaire de calcul
a.f=0;intermédiaire de calcul
b.f=0;intermédiaire de calcul
c.f=0;intermédiaire de calcul
d.f=0;intermédiaire de calcul
e.f=0;intermédiaire de calcul
;***calcul de la date à partir du jour julien***
jd=jd+0.5;ajout de 0.5 au jour julien
z.f=Int(jd);partie entière du jour julien
f.f=jd-z;partie décimale du jour julien
If z<2299161
a=z
Else
alpha=Int((z-1867216.25)/36524.25)
a=z+1+alpha-Int(alpha/4)
EndIf
b=a+1524
c=Int((b-122.1)/365.25)
d=Int(365.25*c)
e=Int((b-d)/30.6001)
d_day=b-d-Int(30.6001*e)+f
If e<14
m=e-1
ElseIf e=14 Or e=15
m=e-13
EndIf
If m>2
y=c-4716
ElseIf m=1 Or m=2
y=c-4715
EndIf
datecalculee$=Str(d_day)+"/"+Str(m)+"/"+Str(y)
ProcedureReturn datecalculee$
EndProcedure
Procedure.s day_of_the_week(jd.f)
jd_bis.l=jd+1.5
weekday.b=jd_bis%7
Select weekday
Case 1
jour$="lundi"
Case 2
jour$="mardi"
Case 3
jour$="mercredi"
Case 4
jour$="jeudi"
Case 5
jour$="vendredi"
Case 6
jour$="samedi"
Case 0
jour$="dimanche"
EndSelect
ProcedureReturn jour$
EndProcedure
Procedure.b annee_bissextile(date_saisie.s)
k.b=0
y.l=Val(StringField(date_saisie,3,"/"));year
If y%4=0
k=1
If y%100=0 And y%400<>0
k=2
EndIf
Else
k=2
EndIf
ProcedureReturn k
EndProcedure
Procedure.s day_of_the_year(date_saisie.s)
y.l=Val(StringField(date_saisie,3,"/"));year
m.l=Val(StringField(date_saisie,2,"/"));month
d.l=Val(StringField(date_saisie,1,"/"));day
k.b=annee_bissextile(date_saisie)
n.l=Int(275*m/9)- k*Int((m+9)/12)+d-30
If k=1
daynumber$= "jour n° "+Str(n)+" (année bissextile)"
Else
daynumber$= "jour n° "+Str(n)+" (année commune)"
EndIf
ProcedureReturn daynumber$
EndProcedure
;***programme principal***
OpenWindow(0,0,0,500,250,"Julian day & applications",#PB_Window_ScreenCentered|#PB_Window_SystemMenu )
;***création des gadgets***
CreateGadgetList(WindowID(0))
TextGadget(#gadget_texte_premiere_date,0,0,300,20,"Première date(format jj / mm / aaaa)")
StringGadget(#gadget_premiere_date,0,20,100,20,FormatDate("01/01/"+"%yyyy", Date()))
TextGadget(#gadget_texte_deuxieme_date,0,50,300,20,"Deuxième date(format jj / mm / aaaa)")
StringGadget(#gadget_deuxieme_date,0,70,100,20,FormatDate("%dd/%mm/%yyyy", Date()))
jd1=calcul_date_jourjulien(GetGadgetText(#gadget_premiere_date))
jd2=calcul_date_jourjulien(GetGadgetText(#gadget_deuxieme_date))
TextGadget(#gadget_jour_julien_premiere_date,0,110,490,20,"Jour julien correspondant à la première date : "+StrF(jd1,1)+" ("+day_of_the_week(jd1)+") "+day_of_the_year(GetGadgetText(#gadget_premiere_date)))
TextGadget(#gadget_jour_julien_deuxieme_date,0,130,490,20,"Jour julien correspondant à la deuxième date : "+StrF(jd2,1)+" ("+day_of_the_week(jd2)+") "+day_of_the_year(GetGadgetText(#gadget_deuxieme_date)))
TextGadget(#gadget_texte_intervalle_de_temps_en_jours,0,180,490,20,"Nombre de jours séparant les deux dates ( valider par ' / ' ) : ")
StringGadget(#gadget_intervalle_de_temps_en_jours,0,200,300,20,StrF(jd2-jd1,1))
;***boucle principale***
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
Case #gadget_premiere_date
jd1=calcul_date_jourjulien(GetGadgetText(#gadget_premiere_date))
TextGadget(#gadget_jour_julien_premiere_date,0,110,490,20,"Jour julien correspondant à la première date : "+StrF(jd1,1)+" ("+day_of_the_week(jd1)+") "+day_of_the_year(GetGadgetText(#gadget_premiere_date)))
StringGadget(#gadget_intervalle_de_temps_en_jours,0,200,300,20,StrF(jd2-jd1,1))
Case #gadget_deuxieme_date
jd2=calcul_date_jourjulien(GetGadgetText(#gadget_deuxieme_date))
TextGadget(#gadget_jour_julien_deuxieme_date,0,130,490,20,"Jour julien correspondant à la deuxième date : "+StrF(jd2,1)+" ("+day_of_the_week(jd2)+") "+day_of_the_year(GetGadgetText(#gadget_deuxieme_date)))
StringGadget(#gadget_intervalle_de_temps_en_jours,0,200,300,20,StrF(jd2-jd1,1))
Case #gadget_intervalle_de_temps_en_jours
If FindString(GetGadgetText(#gadget_intervalle_de_temps_en_jours),"/",1)
jd2=jd1+ValF(GetGadgetText(#gadget_intervalle_de_temps_en_jours))
SetGadgetText(#gadget_jour_julien_deuxieme_date,"Jour julien correspondant à la deuxième date : "+StrF(jd2,1)+" ("+day_of_the_week(jd2)+") "+day_of_the_year(GetGadgetText(#gadget_deuxieme_date)))
SetGadgetText(#gadget_deuxieme_date,calcul_jourjulien_date(jd2))
EndIf
EndSelect
EndSelect
Until Event = 0
Delay(1)
ForEver