Dans le domaine du développement d'applications Web, certains langages offrent une riche collection de fonctions de manipulation des dates simplifiant considérablement les calculs calendaires. Parmi eux, ColdFusion propose plusieurs fonctions spécialisées rarement présentes sous une forme équivalente dans d'autres langages de programmation. L'une de ces fonctions est FirstDayOfMonth, dont le rôle consiste à déterminer la position du premier jour d'un mois à l'intérieur de l'année. Autrement dit, cette fonction indique le numéro du jour correspondant au premier jour d'un mois donné lorsque les jours sont comptés à partir du 1er janvier. Cette information peut sembler anodine à première vue, mais elle s'avère extrêmement utile dans de nombreux domaines tels que la gestion d'agendas, la production de rapports statistiques, les systèmes comptables, les logiciels de planification et les applications nécessitant des calculs de périodes. Par exemple, savoir que le 1er mars correspond au 60e jour d'une année normale ou au 61e jour d'une année bissextile permet d'effectuer rapidement des calculs de durée, de comparer des dates ou de convertir des calendriers en représentations numériques plus faciles à manipuler.
La principale difficulté de ce calcul réside dans la gestion correcte des années bissextiles, puisque le mois de février peut contenir 28 ou 29 jours selon l'année considérée. Cette journée supplémentaire décale alors la position de tous les mois suivants. Le programme QuickBASIC présenté ci-dessous reproduit le comportement de cette fonction en additionnant progressivement le nombre de jours de chaque mois précédant celui demandé. Une fonction complémentaire détermine d'abord si l'année est bissextile selon les règles du calendrier grégorien, puis ajuste le calcul lorsque le mois de février comporte 29 jours. Les tableaux présentés montrent clairement la différence entre une année normale et une année bissextile, où les positions des mois à partir de mars sont décalées d'une unité :
| 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 |
Les exemples fournis pour les années 2000 et 2001 permettent de comparer directement ces deux situations et de vérifier l'exactitude de l'algorithme. Cet exemple illustre parfaitement comment des fonctions de calendrier avancées peuvent être recréées dans QuickBASIC à l'aide de quelques structures de contrôle simples, tout en offrant une solution pratique pour les programmes de gestion du temps, les applications financières et les systèmes de traitement de données chronologiques.
A l'aide du code source QuickBASIC suivant, vous trouverez la réponse que vous souhaitez :
- DECLARE FUNCTION IsLeapYear! (year!)
- DECLARE FUNCTION FirstDayOfMonth! (year!, month!)
- FOR year = 2000 TO 2001
- FOR month = 1 TO 12
- PRINT "Année " + STR$(year) + ", mois " + STR$(month) + ", jour du premier du mois: " + STR$(FirstDayOfMonth(year, month))
- NEXT
- NEXT
-
- FUNCTION FirstDayOfMonth (year, month)
- NumberOfDay = 1
- DIM DayInMonth(12)
- DayInMonth(1) = 31
- DayInMonth(2) = 28
- DayInMonth(3) = 31
- DayInMonth(4) = 30
- DayInMonth(5) = 31
- DayInMonth(6) = 30
- DayInMonth(7) = 31
- DayInMonth(8) = 31
- DayInMonth(9) = 30
- DayInMonth(10) = 31
- DayInMonth(11) = 30
- DayInMonth(12) = 31
- FOR I = 1 TO month - 1
- IF (I = 2) AND (IsLeapYear(year)) THEN NumberOfDay = NumberOfDay + 1
- NumberOfDay = NumberOfDay + DayInMonth(I)
- NEXT
- FirstDayOfMonth = NumberOfDay
- END FUNCTION
-
- FUNCTION IsLeapYear (year)
- IsLeapYear = ((year AND 3) = 0) AND ((year MOD 100 <> 0) OR (year MOD 400 = 0))
- END FUNCTION
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
Langage de programmation - ColdFusion - Référence de procédures et fonctions - FIRSTDAYOFMONTH