DÉTERMINER LE JOUR D'UNE DATE SANS UTILISER LES FORMATS DE DATE ET DE TEMPS (PAS

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 7 janv. 2005 à 02:02
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 - 12 janv. 2005 à 16:54
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/28658-determiner-le-jour-d-une-date-sans-utiliser-les-formats-de-date-et-de-temps-pascal-console

cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
12 janv. 2005 à 16:54
Je vois mon cher japee que certains de tes codes sources te hantent toujours et encore. Et effectivement que je n'attendais pas autant d'ancres. Ce sera toujours une initiative pour le remplacement des boulets.

Pour être vraiment sérieux, DayOfWeek existe tout à fait dans D3. Voici au passage le code source de la fonction. Remarquez que ce n'est pas vraiment du Delphi, mais SysUtils est globalement similaire à ce qui suit, c'est à dire, pas du tout explicite pour certains.

type
TTimeStamp = record
Time: Integer;
Date: Integer;
end;

const
SecsPerDay = 24 * 60 * 60;
MSecsPerDay = SecsPerDay * 1000;
FMSecsPerDay : Single = MSecsPerDay;
IMSecsPerDay : Integer = MSecsPerDay;
DateDelta = 693594;

function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
asm
MOV ECX,EAX
FLD DateTime //manque sûrement une info relative à cette ligne...
FMUL FMSecsPerDay
SUB ESP,8
FISTP QWORD PTR [ESP]
FWAIT
POP EAX
POP EDX
OR EDX,EDX
JNS @@1
NEG EDX
NEG EAX
SBB EDX,0
DIV IMSecsPerDay
NEG EAX
JMP @@2
@@1:
DIV IMSecsPerDay
@@2:
ADD EAX,DateDelta
MOV [ECX].TTimeStamp.Time,EDX
MOV [ECX].TTimeStamp.Date,EAX
end;

function DayOfWeek(Date: TDateTime): Integer;
begin
Result:= DateTimeToTimeStamp(Date).Date mod 7 + 1;
end;

Je crois qu'un tel code source aurait été à moitié deleted. Ce code m'évoque des idées, mais je ne vois pas du tout son principe... :( Mais ManchesTer pourra éventuellement nous éclairer :) Ce que je vois: c'est une belle formule toute faite.

Je n'ai pas mis précédement le commentaire suivant au niveau de DateDelta: { Days between 1/1/0001 and 12/31/1899 } qui est au format étatsunien (ce mot existe). En résumé, on a 1900 ans de disponibilité... Euh ?

Si on stocke des points date sous forme de secondes, on a environ un dt de 150 ans.

Vous savez que les américains disposent d'un dispositif composé de 10 horloges atomiques au caesium, couplées à 10 autres à l'hydrogène, et qui assure une stabilité dans le temps absolument gigantesque ? Imaginez que le retard est de 1 seconde tous les milliards d'années... Ca sert au position des satellites du système GPS. Je finis par me demander comment ils ont fait pour la détecter (statistiques), et surtout s'ils sont capables de déterminer le jour du 3 octobre 1582 ? Le contraire serait vraiment déshonorant. De plus, heureusement qu'ils ne se calibrent pas avec des calendriers...

Finalement, vous m'avez bien embrouillé avec vos histoires de dates et de calendriers. Mais j'ai involontaire trouvé un petit projet en Maple faisant le même boulot. Au passage, s'il n'y avait eu que moi, j'aurais pas fait comme c'était fait: certaines lignes peuvent en effet être simplifiées. Bref! Je comparerai les résultats et je vous informerai. J'essayerai de faire ça le plus tôt possible...

ERRATUM: «Ces histoires de 1700-1800-1900 et 2000 gardé est géré par la division par 400 qui ne doit pas être multiple de 100» est drôlement étrange, car ce qui est divisible par 400 est nécessairement divisible par 100. C'est mal dit, mais indirectement bien compris.

AMELIORATI0N: je fais défiler les jours un par un. Pourquoi ne pas faire défiler les mois? C'est plus technique et surtout moins direct pour ignorer certaines dates que l'utilisateur aurait éventuellement précisé.

japee>
Tu dis que tu as remplacé 3 lignes par pdfToday[4] := DayOfWeek(Now -1); Autant alors migrer cette ligne du DPR dans l'unité PAS au niveau de la fonction InitToday qui devient alors:
procedure InitToday;
begin
pdfToday[1]:=StrToInt(FormatDateTime('dd',Date));
pdfToday[2]:=StrToInt(FormatDateTime('mm',Date));
pdfToday[3]:=StrToInt(FormatDateTime('yyyy',Date));
pdfToday[4]:=DayOfWeek(Now-1);
end;
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
9 janv. 2005 à 19:08
Encore que des bits qui coulent, excusez-moi, c'est bizarre, y'a comme un connotation, ptdr... :))))))))))
Pardon, je referai plus.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
9 janv. 2005 à 19:02
D'accord avec toi, Caribensila, le sujet est loin d'être épuisé (je ne sais si c'est de l'encre qui coule ou des bits, fais attention à tes expressions, mdr... ;-)
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 janv. 2005 à 17:44
Je ne pense pas que granvizir se doutait que sa console allait faire couler autant d'encre... :D
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 janv. 2005 à 17:42
lol
Je voulais dire qu'entre Jules et Grég, les dates concordaient dans toute l'Europe et même au-delà. Ce qui facilite le travail des historiens qui s'occupent quand même rarement des jours de la semaine...
Alors qu'après Grég, bonjour! Comme tu le dis très bien, la révolution d'Octobre a eu lieu en novembre vue de la France...
' fallait faire gaffe pour les rendez-vous! lol
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
9 janv. 2005 à 16:39
Détail amusant, la "révolution d'octobre" en Russie s'est en fait déroulée en novembre pour nous, puisque le calendrier julien sera en vigueur jusqu'au 14 février 1918 dans l'ancienne Russie des Tsars.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
9 janv. 2005 à 16:32
Vraiment pas d'accord avec toi, Caribensila (et je tombe de haut, lol) !

La chienlit, c'est avant ce bon "Gregory the 13th" (pour les intimes).
Il suffit de constituer une liste par pays de la date d'adoption du calendrier grégorien, ce n'est pas insurmontable, et à priori suffisamment documenté.

C'est plus raide pour déterminer à quel moment exact, et à quels endroits, les jours de la semaine tels que nous les connaissons (lundi, mardi, etc...), de même que la semaine de 7 jours, ont été adoptés en remplacement de la manière romaine de les décompter (à rebours, par rapport aux calendes, me semble-t'il).

Là, c'est pas évident du tout. D'autant plus que là aussi, on a continué longtemps à décompter les jours à la manière romaine jusque tard dans le moyen âge.

Dur, dur. Heureusement, mes recherches généalogiques ne m'ont pas encore amené avant le 15 octobre 1582, loin s'en faut !
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 janv. 2005 à 16:03
Pour les problèmes que rencontrent les historiens et les généalogistes, je précise que tous les soucis de date disparaissent avant le 04/10/1582. C'est après cette date que c'est la chienlit! Et cela sur une énorme période, puisque, par exemple Strasbourg n'adopta le Grégorien qu'en 1682 alors que la Lorraine ne le fit qu'en 1760. Sans parler de la Grèce (1916) et de la Roumanie (1919)! lol
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
9 janv. 2005 à 15:19
Toutes mes excuses, grandvizir, tu peux considérer mon deuxième commentaire comme nul et non avenu...
Je m'étais certainement trompé dans la saisie du jour servant de référence.
Pour pallier à ce problème, et pour éviter ce genre d'erreur, j'ai supprimé ces lignes :

//Write('Dire quel jour nous sommes (lundi=1, mardi=2, ..., exit) : ');
//ReadLn(s);
//pdfToday[4]:=StrToInt(s);

...et ajouté celle ci:

pdfToday[4] := DayOfWeek(Now -1);

Ainsi, plus d'erreur possible de la part de l'utilisateur. Mais peut-être la fonction DayOfWeek, présente sur D4, n'est-elle pas disponible sur D3 ?

Quant au "bug grégorien", après tout, Microsoft ne fait pas mieux. Il suffit, pour en tenir compte, de décaler la date du jour de référence de -12 (11 jours) pour les dates antérieures au 15 octobre 1582. A chacun de voir, l'histoire du calendrier julien est de toute manière très tumultueuse et affaire de spécialistes.

Donc, pour les dates antérieures au vendredi 15 octobre:

pdfToday[4] := DayOfWeek(Now -12);

...pour tenir compte du fait que le vendredi 15 octobre a succédé au jeudi 4 octobre 1582, sans transition comme dirait l'autre. A adapter éventuellement pour chaque pays, mais là encore, c'est affaire de spécialistes (historiens, généalogistes, félicitations à ces derniers pour être remonté aussi loin, lol).

Le code lui-même semble se comporter correctement, son étude est très intéressante, en fait il rend tout à fait le service qu'on lui demande.

Donc, bravo, grandvizir.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
8 janv. 2005 à 13:58
Tout à fait d'accord avec toi, grandvizir. Un calendrier n'est qu'un outil créé par et pour l'homme. Il ne prévoit pas vraiment les phénomènes astronomiques mais en dépend plutôt. Il serait vain de vouloir établir un calendrier à une échelle non humaine. Ou alors, nous partons dans des calculs astronomiques (aux 2 sens du terme ;) Ca peut être intéressant, mais ce n'est pas le sujet ici...
Il reste que le code de cette console est intéressant. Et c'est déjà très bien.
Merci pour ce code et ses commentaires, grandvisir.
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
8 janv. 2005 à 12:32
Ces histoires de 1700-1800-1900 et 2000 gardé est géré par la division par 400 qui ne doit pas être multiple de 100.

D'autres exemples:
12 juin 1815 => lundi // lundi
15 janvier 1890 => mercredi // mercredi
29 avril 1908 => mercredi // mercredi
18 juillet 1910 => lundi // lundi
23 novembre 1752 => jeudi // jeudi

Je ne peux pas croire que ça plante avec vos dates alors que sur un dt bien plus large, il n'y a pas d'erreurs. Pour information, avec le composant TDateTimePicker, placez vous au 14 septembre 1752... et déroulez le menu avec le bouton. Oh ? Le mois a 19 jours! Remarquons au passage que la date du composant est bornée.

Mais il faudrait se renseigner un peu plus sur les calendriers (si souvent changés), car il est difficile de croire que notre calendrier actuel est calibré tel quel depuis la date du 3 octobre 1582 avec les phénomènes de rattrapage périodique, d'autant plus que ta page Web précise qu'il existe toujours des décalages temporels.

Je ferais remarquer à Caribensila un phénomène physique intéressant lié à notre chère belle Lune qui nous quittera. La lune ralentit la rotation de la Terre par sa présence, et donc les jours s'allongent. Je cite:
«On estime qu'au Jurassique, l'année durait 375 jours, soit des journées de 23 heures et 36 minutes par rapport à aujourd'hui. Mais dans 60 millions d'années, l'année comportera 360 jours, soit des journées de 24 heures et 30 minutes». Là, on sort un peu des limites du cadre.

Je crois que, même avec une horloge atomique sous le bras, notre calendrier n'est qu'un repère valable que dans un certain intervalle de temps.

Effectivement qu'il y a des divergences de résultats pour certaines dates, mais je ferais remarquer que ma "récurrence" indirecte est temporellement continue (boucle FOR) et que tous les jours sont pris en compte les uns à la suite des autres. Ainsi elle s'oppose à une formule mathématique directe toute faite (dispo sur CppFrance.com) qui peut se planter avec certains cas particuliers. Les dates en forme entière étant plutôt un gadget, histoire d'indiquer la date d'un fichier récemment utilisé (pas besoin de remonter au sacre de Charlemagne par exemple). Pour voir l'encodage des dates vers des entiers, merci de consulter mon code N°24328. Vous me direz que c'est très tarabiscoté... Ce corrupteur de dates précise également dans la description: «Bien que les dates soient fausses, l'Explorateur de Windows les affiche de telle manière qu'elles soient bonnes». Il triche et cache son malaise !

En plus, souvent, le format date est limité (car integer est lui aussi limité). Ce n'est sûrement pas anodin... Aurais-je mis involontairement le doigt sur un épineux problème ?

Pour vérifier mon algorithme, il faudrait créer un programme qui vérifie toutes les dates. Le principe étant de fixer une date, de faire défiler tous les jours afin de s'assurer que lundi, mardi, mercredi... défilent périodiquement. Si dans les résultats on passe de lundi à mercredi, alors il y a une erreur. Si aucune erreur est rencontrée au bout d'un bon long moment, merci de comparer avec les résultats de la méthode mathématique. Cela peut éventuellement faire l'objet d'un sympathique code source...

Remarquons que dans la fonction DayOfWeek, on a dimanche=1, lundi=2, mardi=3... alors que dans mon prog on a lundi=1, mardi=2... Il ne faut donc pas se tromper, ni dans la détermination demandée du jour actuel au tout début de la console.

Ce commentaire est long, mais il se justifie.

Pour finir, si on veut ignorer une date, il suffit de rajouter une condition juste avant le décompte des jours. Car comme déjà dit, le calcul final se fait via un modulo 7.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
7 janv. 2005 à 23:40
"Grégoire XIII décide le 24 février 1582 de supprimer désormais trois années bissextiles sur cent afin de mettre le calendrier en concordance avec l'année solaire par une opération dite «métemptose» - ou équation solaire -.

C'est ainsi qu'il attribue 365 jours, et non 366, à trois sur quatre des années qui inaugurent les siècles. De la sorte, les années 1700, 1800 et 1900 ont été privées du 29 février mais l'année 2000 l'a conservé.

Cette modeste réforme ramène à 25,9 secondes l'écart avec l'année solaire (une broutille).

Par ailleurs, le pape décide de rattraper les dix jours de retard depuis la réforme de Jules César. Le rattrapage se produit dans la nuit du 4 au 15 octobre de la même année."
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
7 janv. 2005 à 22:40
J'ai refait des tests... Désolé mais je ne vois vraiment aucune erreur. J'ai seulement corrigé les caractères MS-Dos.

En ce qui concerne la ligne non traduite, c'était seulement une question d'affichage dans Maple. La variable se modifiait dans le processus et il fallait reprendre celle originale à une condition près. Etant donné que Delphi stocke la date demandée dans un record, le code ignoré n'a aucun sens ni d'influence sur le déroulement du prog. C'est d'autant plus vrai que cette ligne était l'avant-dernière juste avant l'affichage du résultat.

N'y a-t-il pas un système qui rajoute 1 journée tous les 1000 ans ? J'avais cru entendre un truc comme ça...
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
7 janv. 2005 à 22:02
C'est franchement bizarre car mon prog en Maple me donnait les mêmes résultats que ce prog en Delphi. De plus, un autre prog me donne le même intervalle de dates entre deux dates et ainsi, le calcul est nécessairement bon. Avec Maple, j'ai testé tous les cas possibles... mais j'ai une petite idée.

Je refais un test en live pour vous. Nous sommes le vendredi 7 janvier 2005 (IDjour=5) et il est 21h55 lorsque ce post est envoyé (remarquez le décalage sur les serveurs :). Je compare les résultats mon prog avec Windows:

15 février 1995 # non => mercredi // mercredi
1 janvier 1980 #oui => mardi // mardi
25 décembre 2035 # oui => mardi // mardi
25 décembre 2035 # non => mardi // mardi

Oh?... japee> Merci de m'indiquer ta date fausse (avec un delta t si tu veux) afin que je fasse la correction, car en réalité, je sais qu'une ligne de code en Maple n'a pas été traduite. J'en profiterai pour corriger les pb d'affichage des mois dans la console. Par exemple, "décembre" est mal affiché...

Des codes sur CppFrance.com donne des formules toutes faîtes si ça vous intéresse. Je n'ai pas testé, et n'ai pas envie.

Au passage, je trouve bizarre que ça bugge sur dt 49 ans et pas sur dt 35 ans. Y'a forcément des individus qu'ont rajouté des 32 mai...

En tout cas, j'espère que cette console vous a intéressé.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
7 janv. 2005 à 15:17
Et puis je ne suis pas né un lundi, mais un mercredi... bien après l'adoption du calendrier grégorien, lol.
Y'a comme un bug dans ton programme, grandvizir.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
7 janv. 2005 à 14:50
Eh oui, d'autant plus que le calendrier grégorien n'a pas été adopté par tous les pays au même moment, certains étant restés un moment au calendrier julien (de mémoire: Grande-Bretagne, pays orthodoxes comme la Russie, etc...).
Voir le web pour plus de précisions.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
7 janv. 2005 à 02:02
Salut grandvizir.
Le pape Grégoire XIII t'a fait buger, je crois! lol
Le 3 oct 1582 n'était pas un dimanche, mais un mercredi.

voir:
http://www.linternaute.com/histoire/motcle/2812/a/1/1/gregoire_xiii.shtml

Je n'écris ça que parce que je connais ton sens de la perfection... ;)
Rejoignez-nous