Jour julien, applications (8bit born un jeudi il y a 11972j)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Jour julien, applications (8bit born un jeudi il y a 11972j)

Message par Huitbit »

Image

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 :oops:
Je n'ai pas utilisé le gadget calendrier car les dates peuvent aller jusqu'à l'an -4712
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 dates négatives sont acceptées mais...
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)
;dans le calendrier julien prendre b=0
jd=Int(365.25*(y+4716))+Int(30.6001*(m+1))+d+b-1524.5
Je n'arrive pas à savoir sur quels critères il décide de la nature de la date (julienne ou grégorienne).
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
A bientôt pour de nouvelles aventures...............
Elevé au MSX !
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

temps perdu

Message par kernadec »

bonjour huitbit
super bien ton calculateur c'est vrai que les annees
bisextiles m'interessent ,
alors si tu as le temps de completer ton code a ce sujet merci.
je pense que les dates en negatif sont avant JC
et pour le 0.5 il me semble qu'avant 1900 les ephemerides
etaient pour midi et le 0.5 represente 12h donc la demi journee.
car les anciens avaient plus facilement le calcul du sud
avec l'equation du temps a midi,
alors que la nuit le calcul de l'heure etait moins evident.
pour le reste le probleme ce sont les dates de passage
des pays d'un calendrier a l'autre .
voila la liste des dates de changements avec retrait de jours.
je pense que tu sais tout cela !

Some Official Transitions to the Gregorian Calendar Country Last Julian Date The Next Day ...
Italy, Poland, Portugal, Spain October 4, 1582 October 15, 1582
France, Lotharingia December 9, 1582 December 20, 1582
Luxembourg December 14, 1582 December 25, 1582
Holland, Brabant, Flanders December 21, 1582 January 1, 1583
Austria, Bohemia January 6, 1584 January 17, 1584
Hungary (popular use since 1584) October 21, 1587 November 1, 1587
Denmark, Norway February 18, 1700 March 1, 1700
Cities: Pisa, Florence, Venice(?) December 20, 1750 January 1, 1751
England & British dominions September 2, 1752 September 14, 1752
Sweden (1700-1712: Julian+1) February 17, 1753 March 1, 1753
Japan [ Japanese calendar ] January 1, 1873
Alaska [crossed date line!] October 6, 1867 October 18, 1867
Egypt 1875 1875
China [ Chinese calendar ] January 1, 1912
Soviet Union January 31, 1918 February 14, 1918
Greece February 15, 1923 March 1, 1923
Romania (in use since 1919) September 30, 1924 October 14, 1924
Répondre