Dans certains langages de programmation orientés Web, comme ColdFusion, on retrouve de nombreuses fonctions de manipulation de dates particulièrement pratiques qui ne sont malheureusement pas toujours disponibles dans d'autres environnements de développement. Parmi celles-ci figure la fonction « FirstDayOfMonth », dont le rôle consiste à déterminer la position du premier jour d'un mois à l'intérieur d'une année donnée. Autrement dit, cette fonction permet de connaître le numéro du jour de l'année correspondant au premier jour d'un mois précis. Une telle information peut s'avérer très utile lors de la génération de calendriers, de rapports statistiques, de graphiques temporels ou encore pour effectuer des calculs de périodes et d'échéances.
Bien que le problème puisse sembler relativement simple à première vue, il faut tenir compte de plusieurs particularités du calendrier grégorien. En effet, tous les mois ne possèdent pas le même nombre de jours et, de plus, les années bissextiles ajoutent un jour supplémentaire au mois de février. Cette différence modifie la position de tous les mois suivants dans l'année. Ainsi, le premier jour de mars correspond au soixantième jour dans une année normale, mais au soixante-et-unième jour dans une année bissextile. Il devient donc nécessaire de prendre en considération ces variations afin d'obtenir des résultats exacts.
Le tableau suivant présente les positions respectives du premier jour de chaque mois selon qu'il s'agit d'une année normale ou d'une année bissextile. Ces valeurs constituent une référence utile pour comprendre le fonctionnement des calculs de dates et pour vérifier la validité d'un algorithme de calendrier. En accumulant le nombre de jours des mois précédents et en ajustant le calcul lorsque février comporte vingt-neuf jours, il devient possible de reproduire le comportement de la fonction «FirstDayOfMonth» dans un programme Delphi :
| Année normal | Année bissextile | Position du mois | Mois | Jour/Mois |
|---|---|---|---|---|
| 1 | 1 | 1 | Janvier | 31 |
| 32 | 32 | 2 | Février | 28/29 |
| 60 | 61 | 3 | Mars | 31 |
| 91 | 92 | 4 | Avril | 30 |
| 121 | 122 | 5 | Mai | 31 |
| 152 | 153 | 6 | Juin | 30 |
| 182 | 183 | 7 | Juillet | 31 |
| 213 | 214 | 8 | Août | 31 |
| 244 | 245 | 9 | Septembre | 30 |
| 274 | 275 | 10 | Octobre | 31 |
| 305 | 306 | 11 | Novembre | 30 |
| 335 | 336 | 12 | Décembre | 31 |
À l'aide du code source Delphi présenté ci-dessous, vous trouverez donc la réponse recherchée et découvrirez comment calculer efficacement le numéro du premier jour de chaque mois à l'intérieur d'une année donnée. Cette technique constitue également une excellente base pour la réalisation de fonctions plus avancées liées aux calendriers, aux échéanciers et aux traitements de données chronol11ogiques :
- Program FirstDayOfMonthSamples;
-
- {$APPTYPE CONSOLE}
-
- Uses SysUtils;
-
- Function IsLeapYear(Year:Integer):Boolean;Begin
- IsLeapYear:=((Year AND 3) = 0) AND ((Year MOD 100 <> 0) OR (Year MOD 400 = 0));
- End;
-
- Function FirstDayOfMonth(Year,Month:Integer):Integer;
- Const
- DayInMonth:Array[1..12]of Byte=(31,28,31,30,31,30,31,31,30,31,30,31);
- Var
- NumberOfDay,I:Integer;
- Begin
- NumberOfDay:=1;
- For I:=1 to Month-1do Begin
- If(I=2)and(IsLeapYear(Year))Then NumberOfDay := NumberOfDay + 1;
- NumberOfDay := NumberOfDay + DayInMonth[I];
- End;
- FirstDayOfMonth:=NumberOfDay;
- End;
-
- Var
- Year,Month:Integer;
-
- BEGIN
- For Year:=2000 to 2001 do Begin
- For Month:=1 to 12 do Begin
- WriteLn('Année ',Year,', mois ',Month,', jour du premier du mois: ',FirstDayOfMonth(Year,Month));
- End;
- End;
- END.
on obtiendra le résultat suivant :
Année 2000, mois 1, jour du premier du mois: 1Année 2000, mois 2, jour du premier du mois: 32
Année 2000, mois 3, jour du premier du mois: 61
Année 2000, mois 4, jour du premier du mois: 92
Année 2000, mois 5, jour du premier du mois: 122
Année 2000, mois 6, jour du premier du mois: 153
Année 2000, mois 7, jour du premier du mois: 183
Année 2000, mois 8, jour du premier du mois: 214
Année 2000, mois 9, jour du premier du mois: 245
Année 2000, mois 10, jour du premier du mois: 275
Année 2000, mois 11, jour du premier du mois: 306
Année 2000, mois 12, jour du premier du mois: 336
Année 2001, mois 1, jour du premier du mois: 1
Année 2001, mois 2, jour du premier du mois: 32
Année 2001, mois 3, jour du premier du mois: 60
Année 2001, mois 4, jour du premier du mois: 91
Année 2001, mois 5, jour du premier du mois: 121
Année 2001, mois 6, jour du premier du mois: 152
Année 2001, mois 7, jour du premier du mois: 182
Année 2001, mois 8, jour du premier du mois: 213
Année 2001, mois 9, jour du premier du mois: 244
Année 2001, mois 10, jour du premier du mois: 274
Année 2001, mois 11, jour du premier du mois: 305
Année 2001, mois 12, jour du premier du mois: 335
Voir également
ColdFusion - Référence de procédures et fonctions - FIRSTDAYOFMONTH