Section courante

A propos

Section administrative du site

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 :

  1. Program FirstDayOfMonthSamples;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. Uses SysUtils;
  6.  
  7. Function IsLeapYear(Year:Integer):Boolean;Begin
  8.  IsLeapYear:=((Year AND 3) = 0) AND ((Year MOD 100 <> 0) OR (Year MOD 400 = 0));
  9. End;
  10.  
  11. Function FirstDayOfMonth(Year,Month:Integer):Integer;
  12. Const
  13.  DayInMonth:Array[1..12]of Byte=(31,28,31,30,31,30,31,31,30,31,30,31);
  14. Var
  15.  NumberOfDay,I:Integer;
  16. Begin
  17.  NumberOfDay:=1;
  18.  For I:=1 to Month-1do Begin
  19.   If(I=2)and(IsLeapYear(Year))Then NumberOfDay := NumberOfDay + 1;
  20.   NumberOfDay := NumberOfDay + DayInMonth[I];
  21.  End;
  22.  FirstDayOfMonth:=NumberOfDay;
  23. End;
  24.  
  25. Var
  26.  Year,Month:Integer;
  27.  
  28. BEGIN
  29.  For Year:=2000 to 2001 do Begin
  30.   For Month:=1 to 12 do Begin
  31.    WriteLn('Année ',Year,', mois ',Month,', jour du premier du mois: ',FirstDayOfMonth(Year,Month));
  32.   End;
  33.  End;
  34. END.

on obtiendra le résultat suivant :

Année 2000, mois 1, jour du premier du mois: 1
Anné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

Dernière mise à jour : Dimanche, le 17 août 2014