none
Calculs sur les grandes dates passées et futures RRS feed

  • Discussion générale

  • LE CALCUL DE GRANDES DATES DANS LE PASSE ET LE FUTUR : JJ

    Ceci est utile en programmation pour l'astronomique, l'historique, l'astrologique, le généalogique... L'unité de calcul est celle de l'astronomie, elle se nomme JJ pour "Jour Julien" (de Jules César).

    Il faut faire un bref historique pour la compréhension du mécanisme.
    D'une façon générale avant les romains antiques, et même en partie pendant, on calculait avec un calendrier lunaire. Mais ceci avait un inconvénient car le mois lunaire est de 29,53 jours, tandis que le mois terrestre est de 30,43 jours. Alors ces deux méthodes ne correspondaient à peu près que tous les 19 ans (cycle du Grec "Méton" en -432).

    D'ailleurs de nos jour le calendrier lunaire est en vigueur chez certains les musulmans ou chrétiens orthodoxes, toutefois ils sont obligés de tricher en insérant un mois de plus afin de rectifier le plus rapidement possible ; en effet, le calendrier lunaire perd environ 10,88 jours sur l'année solaire. De facto, au bout de presque 3 années on a un mois lunaire de retard qu'il suffit d'intégrer de façon à corriger le décalage par un 13 eme mois lunaire...

    Sous Jules César (Iulius Caesar) en -46 on réforma le calendrier solaire qui avait perdu quasiment une saison en l'an 708 de Rome, on décida de quelques mesures :
    - Il y eut une année dite "de confusion", l'an -46 dura 445 jours, ce qui permit de se recaler.
    - Le début de l'année est fixé au 1er janvier.
    - L'année comporte 365 jours de 12 mois.
    - On créa les années bissextiles, donc l'année moyenne était de 365,25 jours.

    Mais nous prîmes trop d'avance car l'année est de 365,24 jours, ce qui fit une avance de 10 jours 16 siècle plus tard, c'est la raison de la réforme grégorienne (du pape Grégoire XIII) du 4 octobre 1582 de l'ère de Christ, qui instaura deux mesures :
    - Les années ne furent pas bissextiles si elles étaient séculaires et non divisible par 400 sans reste (exemple 1900, année séculaire, n'est pas divisible par 400, elle n'est pas bissextile). Ainsi tous les 4 siècles on enlevait 3 jours.
    - Au jeudi 4 octobre 1582 succéda le vendredi 15 octobre 1582, on enleva 10 jours qui n'ont jamais existé (du 5 au 14 octobre 1582 inclus).

    Toutefois, l'Angleterre n'adopta cette réforme qu'en 1752, ce qui explique d'ailleurs en informatique le fait que le décompte des dates anciennes s'arrête bien avant les autres pays (1752 pour 1582).

    De nos jours on corrige avec des secondes "légales", soustraites ou ajoutées de temps à autre et d'une façon totalement officielle.

    Il faut encore savoir que le calendrier n'a pas été décompté à la naissance du Christ, mais que cette décision vint quatre siècles plus tard environ, il en résulte une imprécision de plus ou  moins quatre ans à notre calendrier actuel.

    En dernier, il n'y a pas eu d'an zéro, on passe de "-1" à "1".
    De notre calendrier au calendrier solaire découlent les fêtes chrétiennes mobiles, mai ceci n'est pas l'objet du présent thème.

    Donc pour en revenir au jour julien, (en anglais "JD" ou encore JDN), les astronomes modernes décidèrent de fixer rétroactivement l'année 0 du JJ au 1er janvier  - 4713 à 12h00 GMT. On peut avoir des JJ négatifs, ce qui n'est pas l'objet de notre calcul ici, nous nous arrêterons à -4713. Contrairement au calendrier chrétien, le calendrier astronomique à une année "0", qui est l'année "-1" du calendrier chrétien.
    Les JJ partent donc du jour "0" de référence, on note le jour suivi d'une virgule qui est une fraction du jour (à la seconde généralement), qui va en indiquer l'heure, par exemple le "JJ 1" à 6h00 s'écrit "JJ 1,25". Dernière précision, comme sus-cité le JJ commence à 12h00 "GMT", donc 0h00 pour le calendrier chrétien correspond à 12h00 du Jour Julien (JJ), on devra tenir compte de cet élément si nous avons besoin de l'heure. En outre il est aussi possible de connaître le nom d'un jour déterminé.

    Bibliographie :
    - Jean Meeus (calculs astronomiques) "société astronomique de France, éditeur"
    - Roger Bouigue (position et mouvement des astres) "Masson, éditeur"

    Logiciels fonctionnants avec le JJ, exemples :
    http://irolog.free.fr/irolog_vente/astro_v/index.htm
    http://irolog.free.fr/irolog_vente/agenda_v/index.htm
    http://irolog.free.fr/irolog_vente/calendrier_v/index.htm
    http://irolog.free.fr/irolog_vente/astronomie_v/astronomie.htm

    C'est désormais la programmation de ces calculs que nous allons voir, montrant comment trouver le JJ d'une date et une date en partant d'un JJ, ainsi que le nom d'un jour déterminé, voici les calculs qui sont destinés à vbNet version 8 (en juin 2010).

     

     

    Option Explicit On
    'objets = 9 (form + (textbox * 6) + (button * 2)
    ' nota bene : les textbox sont chargés pour la démonstration...
     
     
    Class form1
     Dim Jour As Long
     Dim Mois As Long
     Dim Annee As Long
     Dim heure As Long
     Dim JJ As Double
     Dim jourSemaine
     Dim calendrier
     '
     Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     TextBox1.Text = Now.Day
     TextBox2.Text = Now.Month
     TextBox3.Text = Now.Year
     TextBox4.Text = TimeOfDay.Hour
     TextBox5.Text = "" ' JJ
     TextBox6.Text = "" ' résultat
     End Sub
     
     
     
     Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     ' date en JJ
     Dim P As Double
     Dim y As Long
     Dim m As Long
     Dim a As Long
     Dim b As Long
     Dim gregorien As Boolean
     '
     Jour = CLng(TextBox1.Text)
     Mois = CLng(TextBox2.Text)
     Annee = CLng(TextBox3.Text)
     heure = CLng(TextBox4.Text)
     '
     P = Jour + (heure / 24) ' jour,heure
     y = Annee
     m = Mois
     If Mois < 3 Then ' correctif février
     y = y - 1
     m = Mois + 12
     End If
     If y > 0 Then ' année positive
     JJ = Fix(365.25 * y) + Fix(30.6001 * (m + 1)) + P + 1720994.5
     Else ' année négative
     JJ = Fix(365.25 * y - 0.75) + Fix(30.6001 * (m + 1)) + P + 1720994.5
     End If
     If Annee > 1582 Then gregorien = True ' réforme grégorienne
     If Annee < 1582 Then gregorien = False
     If Annee = 1582 Then
     If m < 10 Then gregorien = False
     If m > 10 Then gregorien = True
     If m = 10 Then
     If Jour < 15 Then gregorien = False
     If Jour > 14 Then gregorien = True
     End If
     End If
     If gregorien = True Then ' décompte 10 jours inexistants
     a = Fix(y / 100)
     b = 2 - a + Fix(a / 4)
     JJ = JJ + b
     End If
     If JJ < 0 Then
     TextBox5.Text = "JJ négatif : hor limite (1/1/-4712:12"
     Exit Sub
     End If
     TextBox6.Text = "JJ = " & JJ
     TextBox5.Text = JJ
     End Sub
     
     
     Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
     ' JJ en date
     Dim z As Double ' ent
     Dim f As Double ' dec
     Dim a As Double
     Dim aa As Double ' An
     Dim b As Double
     Dim c As Double
     Dim d As Double
     Dim ee As Double
     Dim jr As Double
     Dim ms As Double
     Dim an As Double
     Dim n As Double
     Dim js As String ' jour semaine
     Dim hjj As Double ' heure du JJ
     '
     JJ = CDbl(TextBox5.Text)
     JJ = JJ + 0.5
     z = Fix(JJ)
     f = System.Math.Round(JJ - z, 3)
     If z < 2299161 Then aa = Fix(z) ' avant réforme grégorienne
     If z >= 2299161 Then ' après réforme grégorienne (-10 jours)
     a = Fix((z - 1867216.25) / 36524.25)
     aa = (z + 1 + a) - Int(a / 4)
     End If
     b = aa + 1524
     c = Int((b - 122.1) / 365.25)
     d = Int(365.25 * c)
     ee = Int((b - d) / 30.6001)
     jr = b - d - Int(30.6001 * ee) + f
     If ee <= 13.5 Then ms = ee - 1
     If ee > 13.5 Then ms = ee - 13
     If ms <= 2.5 Then an = c - 4715
     If ms > 2.5 Then an = c - 4716
     ' 12h JJ = 0h00 calendaire (GMT)
     If heure < 12 Then n = Fix(JJ + 1.5) Mod 7
     If heure >= 12 Then n = Fix(JJ + 1) Mod 7
     Select Case n
     Case 0 : js = "di "
     Case 1 : js = "lu "
     Case 2 : js = "me "
     Case 3 : js = "me "
     Case 4 : js = "je "
     Case 5 : js = "ve "
     Case 6 : js = "sa "
     End Select
     If heure < 1 Then hjj = 0
     If heure > 0 Then
     hjj = JJ - Int(JJ)
     If hjj < 1 Then heure = 0
     If hjj > 0 Then heure = Int(hjj / 0.041)
     End If
     TextBox6.Text = js & Int(jr) & "/" & Format(ms, "00") & "/" & an & " à " & heure & "h"
     End Sub
     
    End Class
    
    

     

     

    Visu :

    http://cid-3662573b5dbcab6a.skydrive.live.com/self.aspx/.Public/JJ.jpg

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire

     

    • Modifié EhJoe lundi 7 juin 2010 10:58 3 ortho
    • Modifié Alex Petrescu lundi 7 juin 2010 12:38 format code
    lundi 7 juin 2010 10:19

Toutes les réponses

  • Bonjour,

    .NET gére de manière native le calendrier Julien via la classe : http://msdn.microsoft.com/fr-fr/library/system.globalization.juliancalendar.aspx

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 8 juin 2010 17:57
    Modérateur
  • Bonjour Gilles,

    Peux-tu me donner deux exemples qui fonctionnent avec le code suivant (s'il est opérationnel ?) ?

    Option Explicit On
    Imports System.Object
    Imports System.Globalization.Calendar
    Imports System.Globalization.JulianCalendar
    Class form1
     Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim CJ As New System.Globalization.JulianCalendar
      MsgBox (CJ.nom du jour du 1er janvier -4500 ?)
      MsgBox (CJ.nombre de jours d'aujourd'hui à l'an -5000 ? ' (volontaire JJ négatif)
     End Sub
    End Class

    Merci, cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 8 juin 2010 19:22
  • Précision nonobstant ce qui a été dit

    Le JJ (jour Julien), est ici utilisé pour des dates relativement courtes (-4700 à + infini), mais si on a besoin de faire des calculs astronomiques ou apparentés sur des millions ou des milliards d'années (outre l'année lumière ou le parsec),  le seul point identique dans tous les calculs mathématiques, et la seule unité utilisée par les astronomes n'est pas la classe de MS mais bien le "JJ", et ceci depuis 1849... Le but de ce calcul étant justement de ne pas être enfermé dans une époque déterminée ou un système informatisé, mais de pouvoir calculer et comparer avec d'autre calculs en dehors de tout contexte, c'est la phase calculs qui est intéressante car universelle avec ou sans ordinateur. Et savoir le calculer permet d'interférer si besoin dans les calculs, ce que ne permet pas toujours une fonction toute faite.

    Cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 9 juin 2010 11:16
  • Bonjour,

    Oui, en effet... La limite des dates supportées par le .NET Framework est de 1/1/0001 à 31/12/9999.

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 9 juin 2010 21:18
    Modérateur