Bonjour,
Je vous propose un nouveau code source : Date du dimanche de Pâques
Programme calculant la date du dimanche de Pâques pour une année quelconque du calendrier grégorien.
Qu'en pensez-vous ?
Bonjour,
Je vous propose un nouveau code source : Date du dimanche de Pâques
Programme calculant la date du dimanche de Pâques pour une année quelconque du calendrier grégorien.
Qu'en pensez-vous ?
Si ça intéresse quelqu'un j'ai le même genre de programme pour l'Epiphanie, la Chandeleur, la saint Valentin, l'Assomption, la Toussaint, Noël et le Nouvel an.
Je suis preneur !
Mie,
Goog te donnera pas mal de réponses.
C'est un vieux programme. Je l'ai écrite en à mes débuts en pascal. 1990 je crois. Il a passé sans encombre le cap de l'an 2 000. J'espère qu'il en sera de même pour l'an 10 000. Si ce n'est pas le cas signalez le moi et j'y apporterais les corrections nécessaires.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 program Divination; begin WriteLn('Hummm....'); WriteLn('D''après mes calculs, cette année, Noël tombera le 25 Décembre.'); end.
@batyann811
En fait je n'avais pas lu assez attentivement ton premier message et je ne m'étais pas rendu compte de la plaisanterie !
J'avais en tête le calcul des fêtes mobiles relatives à Pâques et j'ai cru que c'était de cela que tu parlais.
Je vous propose l'unité Fetes, qui permet de connaître la date d'une fête relative à Pâques, par exemple la date du mercredi des Cendres. Le calcul se base sur une table des dates de Pâques de 1900 à 2199.
Si vous lisez ce message avant 1900 (ce qui m'étonnerait franchement mais on ne sait jamais) ou après 2199, vous ne pouvez pas utiliser ce programme. Vous devez acheter la version "Pro".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 program JourCendres; {$APPTYPE GUI} {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} uses Windows, SysUtils, Fetes; const CENDRES = -46; var s: string; y: word; begin y := CurrentYear; s := 'Jour des Cendres'#13#13 + ChaineJour(JourRelatifPaques(y, CENDRES)); MessageBox(0, pChar(s), pChar('Année ' + IntToStr(y)), MB_OK); end.
Salut Roland,
Je n'en mourrais pas[...] après 2199, vous ne pouvez pas utiliser ce programme.
Puissent ces fêtes exister encore au delà de cette date.
Moi non plus.
J'ai fait une recherche sur les jours juliens (que je confondais auparavant avec le calendrier julien). Voici deux fonctions qui permettent de convertir une date grégorienne en jour julien et inversement.
Je pourrais utiliser ces fonctions pour trouver la date des fêtes mobiles (encore que j'aime bien mon algorithme actuel). Je songe à reprendre tous ces programmes (algorithme d'Oudin, table des dates de Pâques, fêtes mobiles, jour julien) et à les réécrire avec un style uniforme. Je me dis aussi qu'il serait bon de prendre pour base le type standard TDateTime, au lieu du type que j'ai déclaré :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 { http://www.tondering.dk/claus/cal/julperiod.php } program JulianDayNumber2; {$IFDEF FPC}{$MODE DELPHI}{$ENDIF} function JulianDayNumber(const year, month, day: integer): integer; { Converts a calendar date to a Julian Day. } var a, b, c: integer; begin a := (14 - month) div 12; b := year + 4800 - a; c := month + 12 * a - 3; result := day + ((153 * c + 2) div 5) + 365 * b + (b div 4) - (b div 100) + (b div 400) - 32045; end; procedure ConvertJulianDayNumber(const jdn: integer; out year, month, day: integer); { Converts a Julian Day to a day, month, and year. } var a, b, c, d, e, f: integer; begin a := jdn + 32044; b := (4 * a + 3) div 146097; c := a - (146097 * b) div 4; d := (4 * c + 3) div 1461; e := c - ((1461 * d) div 4); f := (5 * e + 2) div 153; day := e - ((153 * f + 2) div 5) + 1; month := f + 3 - 12 * (f div 10); year := 100 * b + d - 4800 + f div 10; end; var y, m, d: integer; begin WriteLn(JulianDayNumber(1582, 10, 15) = 2299161); { JD is the Julian Day that starts at noon TT on the specified date. } ConvertJulianDayNumber(2299161, y, m, d); WriteLn((y = 1582) and (m = 10) and (d = 15)); end.
Vos idées sont les bienvenues.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 type tJour = record s, j, m, a: word; // 1..7, 1..31, 1..12, 1900..2199 end;
salut
un truc que j'ai dans mes carton depuis des années
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Function LundiPaques(Iyear : Integer) : TDateTime; Var L : array[1..6] of LongInt; Lj,Lm : LongInt; begin L[1] := Iyear Mod 19; L[2] := Iyear Mod 4; L[3] := Iyear Mod 7; L[4] := (19 * L[1] + 24) Mod 30; L[5] := ((2 * L[2]) + (4 * L[3]) + (6 * L[4]) + 5) Mod 7; L[6] := 22 + L[4] + L[5]; If L[6] > 31 Then begin Lj := L[6] - 31; Lm := 4; end Else begin Lj := L[6]; Lm := 3; End; //' Lundi de Pâques = Paques + 1 jour Result := DateIncDay(EncodeDate(Iyear,Lm,Lj),1); End; Function EstFerie(QuelleDate : TDateTime) : Boolean; Var anneeDate : Integer; joursFeries : Array[1..11] of TDateTime ; i : Integer; begin anneeDate := Yearof(QuelleDate); joursFeries[1] := EncodeDate(anneeDate, 1, 1); joursFeries[2] := EncodeDate(anneeDate, 5, 1); joursFeries[3] := EncodeDate(anneeDate, 5, 8); joursFeries[4] := EncodeDate(anneeDate, 7, 14); joursFeries[5] := EncodeDate(anneeDate, 8, 15); joursFeries[6] := EncodeDate(anneeDate, 11, 1); joursFeries[7] := EncodeDate(anneeDate, 11, 11); joursFeries[8] := EncodeDate(anneeDate, 12, 25); joursFeries[9] := LundiPaques(anneeDate); joursFeries[10] := DateIncDay(joursFeries[9],38); //' Ascension = lundi de Paques + 38 joursFeries[11] := DateIncDay(joursFeries[9],49); //' Lundi Pentecôte = lundi de Paques + 49 EstFerie := False; For i := 1 To 11 do If trunc(QuelleDate) = trunc(joursFeries[i]) Then EstFerie := True End;
Bonjour,
Je crois que j'en avais déjà parlé : attention, si on veut vraiment être exact, il faut tenir compte de l'heure, et donc du fuseau horaire pour lequel on fait la conversion.
En effet, le jour Julien commence à 12:00 GMT, donc...
Cette petite fantaisie vient du fait que le jour Julien a été défini par les astronomes, qui ne voulaient pas que la date change pendant une nuit d'observation.
@droggo
Merci pour ces indications. Oui, je me souviens bien de la précédente discussion.
@anapurna
Merci pour le code.
Aïe !
C'est le second résultat qui est le bon, on est d'accord ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 program dateutils_datetimetojuliandate; {$APPTYPE CONSOLE} uses SysUtils, DateUtils; begin WriteLn(Format( '%.1f', [DateTimeToJulianDate(EncodeDateTime(1582, 10, 15, 12, 0, 0, 0))] )); ReadLn; // 2299160,5 (FPC 3.0.0) // 2299161,0 (Delphi 7) end.
J'ai l'impression que je ne suis pas le seul à avoir fait la confusion entre jour julien et calendrier julien (il faut dire que l'appellation a été mal choisie). La description de la fonction dans la documentation de Free Pascal contient une formule ambiguë :
Ben non, justement, ce n'est pas "as opposed to gregorian".
Code : Sélectionner tout - Visualiser dans une fenêtre à part DateTimeToJulianDate converts the AValue date/time indication to a julian (as opposed to Gregorian) date.
Je vous propose une version révisée de ce programme :
Date de Pâques
Je me suis amusé à fabriquer une documentation avec PasDoc. Il n'y a pas grand chose dedans, mais c'est très joli (et facile à faire).
Partager