
Du coup ma liste de jour est squizée
: C'est "Algorithme" le mot justepat a écrit :logarithme
Code : Tout sélectionner
An.i = Val(Left(Annee,FindString(Annee,".",1)))-25569
Debug FormatDate("%dd/%mm/%yyyy",AddDate(Date(1970,1,1,0,0,0),#PB_Date_Day,an))
Voilà la réponse à ta question; j'ai dû attendre la fin de mes vacances pour pouvoir faire toutes les vérifications nécessaires. C'est fait. J'ai laissé le .50 à la fin des numéros parce qu'habituellement on peut aussi décrire l'heure, les minutes e les secondes du jour. Bien sûr j'ai laissé tomber cet aspect. Bon courage.pat a écrit :A beruska.
J'ai regardé ton programme de près.
J'ai constaté que ce que j'avais vu dans un livre des années 80 n'était pas tout à fait à pareil à ton logarithme, même si cela y ressemblait fort, c'est pourquoi j'ai cru au même logarithme.
Ton programme permet, à partir d'une date, de connaître le jour de la semaine et aussi d'avoir un numéro de série.
Ton programme donne un numéro de série avec des décimales, ce qui n'est pas le cas sur Excell ou sur OpenOffice qui donne un numéro de série avec des entiers.
On peut donc, avec ton programme, également connaître l'écart entre deux dates, il suffit de soustraire les 2 numéros de séries.
Mais comme il y a des décimales, bien évidemment le résultat donne parfois aussi des décimales et on ne sait pas s'il faut arrondir au plus près ou tronquer la décimale. Mais je crois que ton programme fonctionne correctement.
Exemple :
Je veux connaître l'écart de jours entre le 06/07/2011 et le 06/07/3000. Soit 361225 jours exactement.
Numéro de série du 06/07/2011 : 2455744,5.
Numéro de série du 06/07/3000 : 2816969.5.
Le résultat donne 361225.5 donc je suppose qu'il faut tronquer la décimale.
Merci de me confirmer s'il en est ainsi.
Pour être complet il me faudrait connaître maintenant une opération que ton programme ne fournit pas mais qui peut être utile pour le calcul sur les dates. Je veux parler de connaître une date par son numéro de série (donc l'inverse de ton programme).
Cela peut servir, par exemple, pour ajouter ou soustraire des jours d'une date donnée.
Exemple :
Pour la date du 06/07/2011 (donc je connais le numéro de série) je souhaite ajouter 5 jours et connaître la nouvelle date ainsi donnée.
Mon programme devrait trouver le 11/07/2011.
Voilà à quoi cela peut servir.
Sauras-tu m'indiquer le logarithme qui m'indiqueras donc à partir du numéro de série la date qui y correspond ?
Ton programme est très intéressant mais il me manque ce dernier logarithme pour que cela soit complet et comme le numéro de série contient des décimales il n'est pas facile de trouver, sans savoir comment faire, le résultat.
Code : Tout sélectionner
; Retrouver la date qui correspond au numéro du jour julien
; Insérer par exemple 2455770.5 et on trouve le 28 juillet 2011
; Possibilité de voir une série de 50 jours en mettant les deux premières lignes en commentaire
; et en activant une des deux boucles For... Next... lignes suivantes
; PB 4.51 by beruska
a$ = InputRequester("", "Insérer jour julien","") ; insérer le jour sous la forme xxxxxxx.50
JJ.f = ValF(a$)
; For x = 1 To 50 ; premier exemple à cheval sul les deux calendriers
; JJ.f = 2299150.5 + x
; For x = 1 To 50 ; deuxième exemple pour une année bissextile
; JJ.f = 2451580.5 + x
z = JJ + 0.5 ; début de l'algorithme
cod = Int((z - 1867216.25)/36524.25)
a = z + 1 + cod - Int(cod/4)
If z < 2299161 ; pour les jours avant le 15 octobre 1582
w = z
Else
w = a ; pour le calendrier grégorien
EndIf
b = w + 1524
c = Int((b - 122.1)/365.25)
d = Int(365.25 * c)
e = Int((b-d)/30.6001) ; fin del l'algorithme
jour = b - d - Int(30.6001 * e) ; recherche du jour
If e < 13.5 ; recherche du mois
mois = e - 1
Else
mois = e - 13
EndIf
If mois >= 2.5 ; recherche de l'année
annee = c - 4716
Else
annee = c - 4715
EndIf
Debug StrF(JJ,2) + " - " + Str(jour) + "-" + Str(mois) + "-" + Str(annee) ; le résultat
; Next
Je me suis amusé à faire les deux procédures date-->jour julien, et jour julien-->datepat a écrit :Un grand merci à toi beruska.
Je pense que je ne serais pas le seul à apprécier ton code.
Maintenant tout est complet au niveau des dates et beaucoup s'y inspireront et grâce à toi.
Et en plus cela ne prend pas beaucoup de place.
Un super merci.
Code : Tout sélectionner
; Exemple de calcul sur les dates avec l'emploi des jours juliens - by beruska
; NOTA: les dates doivent toujours figurer en format JJ MM AAAA avec espaces ou séparateurs.
Global jj.f
Global jour, mois, annee
; ------------------------------------
; D'UNE DATE QUELCONQUE AU JOUR JULIEN
; ------------------------------------
Procedure Julien(d$)
j = Val(Left(d$,2)) ; j = valeur numérique du jour
m = Val(Mid(d$,4,2)) ; m = valeur numérique du mois
y = Val(Right(d$,4)) ; y = valeur numérique de l'année
A0.f = y + m/100 + j/10000 ; préparation de la date 15/10/1582
A0 = Int(A0*10000+0.5)/10000 ; sous la forme 1582.1015
If m < 3 ; le calcul commence toujours au 1er mars; janvier et février figurent
m+12 ; comme le 13è et 14è mois de l'année précédente
y-1
EndIf
If A0 > 1582.1004 And A0 < 1582.1015 ; le lendemain du 04/10/1582 est le 15/10/1582
MessageRequester("Error", "Date inexistante") ; donc éliminons les dates inexistantes (du 5 au 14)
Goto iniz ; on recommence
EndIf
a = Int(y/100)
If A0 < 1582.1015
b = 0 ; pour les dates du calendrier julien
Else
b = 2-a+Int(a/4) ; pour les dates du calendrier grégorien
EndIf
c = Int(365.25 * y)
d = Int(30.6001 * (m+1))
jj.f = b + c + d + j + 1720994.5 ; jj est le jour julien de la date choisie
ProcedureReturn
EndProcedure
; ---------------------------------------
; DU JOUR JULIEN A LA DATE CORRESPONDANTE
; ---------------------------------------
Procedure Conversion(a$)
JJ.f = ValF(a$)
z = JJ + 0.5 ; début de l'algorithme
cod = Int((z - 1867216.25)/36524.25)
a = z + 1 + cod - Int(cod/4)
If z < 2299161 ; pour les jours avant le 15 octobre 1582
w = z
Else
w = a ; pour le calendrier grégorien
EndIf
b = w + 1524
c = Int((b - 122.1)/365.25)
d = Int(365.25 * c)
e = Int((b-d)/30.6001) ; fin del l'algorithme
jour = b - d - Int(30.6001 * e) ; recherche du jour
If e < 13.5 ; recherche du mois
mois = e - 1
Else
mois = e - 13
EndIf
If mois >= 2.5 ; recherche de l'année
annee = c - 4716
Else
annee = c - 4715
EndIf
ProcedureReturn
EndProcedure
; -------------------------------
; UTILISATION DES DEUX PROCEDURES
; -------------------------------
; Insérer sa propre date de naissance
; Ajouter un nombre de jours (10000, 20000 par exemple)
iniz:
datechoisie$ = InputRequester("", "Date de naissance? [gg mm aaaa]","")
Julien(datechoisie$)
p.f = jj ; mémorise le résultat du jour julien
variation.l = Val(InputRequester("", "variation? nombre de jours",""))
p + variation
p$ = StrF(p,2)
Conversion(p$)
MessageRequester("","je suis né le " + datechoisie$ + Chr(13) + "j'aurai " + Str(variation) + " jours le " + Str(jour) + "-" + Str(mois) + "-" + Str(annee))
End