note au modérateur : désolé, je pensais faciliter la tâche de mes correspondants, dont certains étaient Britanniques, en leur répondant en français. Je comprends votre commentaire, et j’en tiendrai compte à l’avenir.
note au modérateur : désolé, je pensais faciliter la tâche de mes correspondants, dont certains étaient Britanniques, en leur répondant dans leur langue. Je comprends votre commentaire, et j’en tiendrai compte à l’avenir.
Bon, je remercie tous ceux qui ont pris la peine de me répondre, mon problème est maintenant résolu, même si ce n’est pas de la façon que j’imaginais. Mon besoin étant de calculer un temps écoulé (en jours calendaires ou en jours de bourse) depuis un évènement dont la date m’est connue, j’avais imaginé de passer en argument CurrentDay= Days. Cela ne marche pas, mais par contre CurrentDay= Date marche. Toutefois faire la différence entre deux dates en format YYYMMDD ne donne pas un nombre de jours. Sur une idée de kingmordecal, j’ai donc créée l’indicateur PSEUDODAYS, qui me permet de faire une soustraction me donnant un résultat qui, s’il introduit de petites bizarreries dans le décompte à cause des années bissextiles, ou des mois dont le nb de jours n’est pas égal à 30, répond quand même à mon besoin. Bon, pour les puristes, c’est un peu crade comme solution, mais je vais m’en contenter….
(je fais une parenthèse : j’ai développé une application (en LibreOffice , puis en Excel) de thermique qui calcule la température sur une année dans ma maison (mon grenier, ma cave, mon séjour, les tuiles de mon toit, etc …) en intégrant l’équation de Fourier à l’intérieur de mes murs (pas de deux minutes .. ) en tenant compte de l’effet du rayonnement solaire sur mes tuiles, etc .. en utilisant d’une température extérieure reconstituée par morceaux de sinusoïdes à partir des Min et des Max journaliers sur une année. C’est une plaisanterie qui m’a demandé des milliers d’heures de travail. Et bien le plus dur dans tout ça, ce n’a pas été les problèmes de thermique (pourtant difficiles), mais la gestion des années bissextiles sur des durées d’exécution à cheval sur deux années ! (ainsi que le fait de slalomer entre les bugs d’Excel dans les dates) !!!!
Indicateur PSEUDODAYS (variable d’appel TheDate)
TheYear = Floor(TheDate / 10000, 0)
TempDay = Floor(TheDate / 100, 0)
TheDay = ((TheDate / 100) – TempDay) * 100
TempMonth = Floor(TheDate / 100, 0) * 100
TempMonth2 = TempMonth / 10000
TheMonth = (TempMonth2 – Floor(TempMonth / 10000, 0)) * 100
PseudoDays= (TheYear-1900)*365+TheMonth*30+TheDAY
Return PseudoDays
JSParticipant
Senior
Bonjour,
Ce code est moins sujet aux erreurs d’arrondi…
TheYear = Floor(TheDate / 10000)
TheMonth = Floor(TheDate / 100) MOD 100
TheDay = TheDate MOD 100
PseudoDays = (TheYear - 1900) * 365 + TheMonth * 30 + TheDay
RETURN PseudoDays
DAYS restitue le nombre de jours écoulés depuis le 1/1/1970 (en mode similaire à Unix) à la barre indiquée entre le carré des parents.
Si cette barre est indiquée, vous devez vous assurer du courant par défaut.
Je ne sais pas à quoi servent vos codes, mais juste pour tester le fonctionnement de CALL, les codes que j’ai postés fonctionnent.
Bon, grâce à JS, je peux même propose une version de PSEUDODAYS qui devrait donner le résultat exact (sauf que mon code plante (“calculation error”), et je ne sais pas pourquoi !)
$JOURS[1]=0
$JOURS[2]=31
$JOURS[3]=59
$JOURS[4]=90
$JOURS[5]=120
$JOURS[6]=151
$JOURS[7]=181
$JOURS[8]=212
$JOURS[9]=243
$JOURS[10]=273
$JOURS[11]=304
$JOURS[12]=334
$JOURS[13]=365
TheYear = Floor(TheDate / 10000)
TheMonth = Floor(TheDate / 100) MOD 100
TheDay = TheDate MOD 100
DaysOfPreviousMonths=$JOURS[TheMonth]
CorrectBissext=FLOOR((TheYear-1900)/4)
NewPseudoDays = (TheYear – 1900) * 365+CorrectBissext + DaysOfPreviousMonths + TheDay
RETURN NewPseudoDays
(Il reste à corriger une erreur résiduelle si , das une année bissextile en cours, on est au delà du 28 Février …)
JSParticipant
Senior
Salut,
Ce qui est frappant, c’est que « $Days[ ] » et « $Jours[ ] » sont utilisés de manière interchangeable…
Le code est adapté au format de date : YYYYMMDD (et non DDMMYYYY)
Je pense que le code fonctionne bien…
JSParticipant
Senior
Oubliez le point 1, c’était à cause de la traduction…
JSParticipant
Senior
Le code fonctionne bien jusqu’en 2099 car les années du siècle (2100, 2200, 2300,…) ne sont pas des années bissextiles et avec « Floor((TheYear-1900)/4) » après 2100 vous comptez 1 jour de trop…
Avec ça, le résultat devrait être correct .. (NB : 1) je teste CurrentYearFeb29Issue par rapport à 1, le logiciel a refusé de faire le test par rapport à True. Pourquoi ? 2) mon code plante toujours .. des idées ?)
JOURS[1]=0
$JOURS[2]=31
$JOURS[3]=59
$JOURS[4]=90
$JOURS[5]=120
$JOURS[6]=151
$JOURS[7]=181
$JOURS[8]=212
$JOURS[9]=243
$JOURS[10]=273
$JOURS[11]=304
$JOURS[12]=334
$JOURS[13]=365
TheYear = Floor(TheDate / 10000)
TheMonth = Floor(TheDate / 100) MOD 100
TheDay = TheDate MOD 100
CurrentYearFeb29Issue=(TheYear MOD 4) =0 AND (TheYear MOD 100) <>0
IF (CurrentYearFeb29Issue = 1) AND (TheMonth>2) THEN
Feb29Issue=1
Else
Feb29Issue=0
ENDIF
DaysOfPreviousMonths=$JOURS[TheMonth]+Feb29Issue
CorrectBissext=FLOOR((TheYear-1901)/4)-FLOOR((TheYear-1901)/100)
NewPseudoDays = (TheYear – 1901) * 365+CorrectBissext + DaysOfPreviousMonths + TheDay
RETURN NewPseudoDays
JSParticipant
Senior
Salut,
Je pense que le code est correct maintenant…
Attention aux traductions de l’anglais vers le français car ce n’est pas toujours cohérent…
J’ai joint le « itf-file » que vous pouvez importer dans les indicateurs de PRT…
TheDate=20250822
If BarIndex=0 then
$Days[1]=0
$Days[2]=31
$Days[3]=59
$Days[4]=90
$Days[5]=120
$Days[6]=151
$Days[7]=181
$Days[8]=212
$Days[9]=243
$Days[10]=273
$Days[11]=304
$Days[12]=334
EndIf
TheYear=Floor(TheDate/10000)
TheMonth=Floor(TheDate/100) MOD 100
TheDay=TheDate MOD 100
CurrentYearFeb29Issue=(TheYear MOD 4)=0 and (TheYear MOD 100)<>0 or (TheYear MOD 400)=0
If CurrentYearFeb29Issue and TheMonth>2 then
Feb29Issue=1
Else
Feb29Issue=0
EndIf
DaysOfPreviousMonths=$Days[TheMonth]+Feb29Issue
CorrectBissext=Floor((TheYear-1901)/4)-Floor((TheYear-1901)/100)+Floor((TheYear-1601)/400)
NewPseudoDays = (TheYear-1901)*365+CorrectBissext+DaysOfPreviousMonths+TheDay
RETURN NewPseudoDays
Merci ! Bon cette fois on peut fermer ce fil, problème résolu !