Déterminer le jour d'une date sans utiliser les formats de date et de temps (pascal, console)

Soyez le premier à donner votre avis sur cette source.

Vue 12 049 fois - Téléchargée 754 fois

Description

Initialement, c'était un programme Maple que je voulais migrer en C++ ou en PHP. Mais finalement, Delphi n'avait pas de prog de ce genre. Donc => migration.

L'idée était de ne pas utiliser les types TDateTime et compagnie, car Maple est un outil mathématique et non bureautitique (sans faute!). En affirmant ceci, on part d'un tableau et on récurse le tout avec des boucles. Un modulo 7 a la fin clos le calcul. Aucune limite n'est à concevoir: on peut démarrer des hommes préhistorique et finir avec l'Univers.

Non seulement le prog affiche le jour d'une date, mais il peut donner un intervalle de jours entre les dates prédéfinies. Le code source peut sembler à première vue pas évident à la compréhension, mais il se révèle en fait tout simple par son principe. La mise en oeuvre est seulement plus délicate...

Le Zip est séparé entre une interface console et une unité réutilisable dans d'ultérieurs programmes. Mais étant donné l'existence de la fonction DayOfWeek, ceci serait surprenant. En revanche, ce code source est qualifiable de 95% Pascal pur, car en définitivement aucun USES n'est requis dans ce code, excepté bien sûr SysUtils pour les fonctions StrToInt et IntToStr. Des fonctions existantes telles que IsLeapYear ont été intégrées.

Indication: la révolution française était un mardi, le Titanic un dimanche. Ca permet de savoir si ça bugge...

Conclusion :


Vous pouvez toujours visiter http://altert.family.free.fr/

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
10 -
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
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1 -
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
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1 -
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
13 -
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
13 -
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.