Accueil Nouveautés Sommaire

Dates, périodes

La démarche Notions de base Composants de base Analyses Le glossaire

Remonter

 

Version du 05 10 2013

 

Présentation. 2

Dates. 3

Opérations sur les dates. 6

Périodes. 13

Opérations sur les périodes. 15

Durées calendaires. 19

Annexe : Opérations sur les durées calendaires. 21

Annexe : Comparaisons entre dates et périodes. 23

Notes de mise en œuvre : Détermination des durées. 25

Notes de mise en œuvre : Déplacement des dates. 28

 


Présentation

Objectifs

La gestion du temps est au cœur des applications prises en charge par le Régime d’assurance chômage. L’objectif est de répondre aux problèmes récurrents et élémentaires posés par cette gestion.

 

La réponse passe par :

·       la présentation des quelques catégories nécessaires à la résolution des spécifications liées à la gestion du temps calendaire,

·       la définition d’un vocabulaire associé au traitement du temps calendaire,

·       la détermination d’hypothèses unifiant les traitements,

·       l’établissement de conventions permettant les traitements aux limites.

 

La solution proposée sert de base et de modèle à la gestion du temps « relatif » (à la consommation du droit ou de toute autre quantité imputable).

 

L’étude ne prend pas en compte :

·       la problématique des jours ouvrables,

·       la gestion de la couche de présentation.

 

Résumé

Le document présente les primitives concernant la gestion du temps calendaire :

·       les dates,

·       les périodes (intervalle de temps compris entre deux dates (bornes incluses),

·       les durées calendaires (intervalle de temps exprimé sous forme d’un triplet année, mois jour).

 

Le comportement de chacune des ces primitives est présenté.

 


Dates

Définition

Temps mesuré par le calendrier grégorien. Une date est exprimée par un triplet : année, mois, jour.

 

Les heures / minutes / secondes ne présentent pas d’intérêt dans la perspective fonctionnelle des applications.

 

synonyme : date calendaire

 

Vocabulaire

Date : Indication du jour, du mois et de l’année où un acte a été passé, où une action s’est produite (Robert).

 

Date d’effet : Date à laquelle un événement doit être pris en compte.

 

Date de connaissance : Date à laquelle un objet, une information est connue du le système d’information.

 

Date de début : Date à partir de laquelle une caractéristique doit être prise en compte, une règle doit être appliquée ou un état doit changer.

 

Date de fin : Date jusqu’à laquelle une caractéristique doit être prise en compte, une règle doit être appliquée ou un état doit être maintenu. Au lendemain d’une date de fin, il est nécessaire de neutraliser les caractéristiques issues de la date de début correspondant.

 

Date la plus ancienne : La plus petite des dates.

 

Date la plus récente : La plus grande des dates.

 

Durée entre deux dates

La durée entre deux dates correspond au nombre de jours qui s’écoulent entre ces deux dates. La durée entre deux dates identiques est égale à 0 jours. Par convention, un nombre de jours entre deux dates est positif ou nul

 

Durée d’une période

La durée d’une période correspond à la durée entre sa date de début et sa date de fin augmentée d’une journée. La durée d’une période dont les dates de début et de fin sont identiques est égale à 1 jour.

 

 

Généralités sur les dates et les durées

Construction

Une date est représentée par un triplet :

·       année (aaaa)

·       mois (1-12)

·       jour(1-31)

 

La création d'une date :

·       vérifie sa validité (compatibilité jours, mois, année),

·       s'assure qu'elle appartient à la période définie par les deux les dates limites.

 

Une date non valide lance une exception.

 

Dates limites dan le système d’information

Pour être valides, les dates doivent être comprises entre deux dates limites :

·       la date mini (01/01/1900),

·       la date maxi (31/12/2399).

 

La plage couverte par ces dates doit être restreinte en fonction de la plage de validité de la formule utilisée conversion entre les dates calendaires et les jours juliens.

 

Il est à noter que l’existence de ces constantes permet d’initialiser des dates afin de rendre compatibles des comparaisons.

 

Détermination des durées, déplacement des dates

La détermination des durées, le déplacement des dates peut se faire soit par l’utilisation de tables, soit par les opérations dérivées de la transformation d’uns date en une valeur numérique.

 

La transformation d’une date du calendrier grégorien en une valeur numérique passe par l’utilisation du calendrier Julien (voir « Eléments de mise en œuvre des composants de base »)

 

Dans le cadre de l’étude, la conversion d’une date en une valeur numérique n’est pas « publique ».

 

Voir « Eléments de mise en œuvre » de la gestion du temps.

 

 

Typologie des opérations sur les dates

On distingue des opérations :

·       de construction,

·       de présentation,

·       d’accession aux composants élémentaires, à la veille, au lendemain…),

·       d’accession à des dates dérivées,

·       de modification,

·       de détermination de la durée entre deux dates,

·       de déplacement de dates, vers l’avant, vers l’arrière,

·       de détermination de la situation relative à une autre date, à une période,

·       de recherche de la plus petite (la plus grande) date d’un ensemble de dates …

 

Saisie et présentation des dates

La saisie et la présentation à l’écran des dates sont normalisées ; elles peuvent faire l’objet de « préférences ».

 

Remarque sur les opérations retournant des dates

Pour des raisons de performances et d’optimisation, les opérations qui créent une date en retour peuvent faire l’objet d’une version dans laquelle la date à retourner est un paramètre en entrée et en sortie, évitant ainsi la création d’un nouvel objet.

 

Interfaces implémentés

Les interfaces sérialisable, cloneable et comparable sont implémentées.

 


Opérations sur les dates

 

Constructeurs

 

Damj(int année, int mois, int jour)

Crée la date correspondante aux paramètres fournis. Lance une exception si la date est invalide

 

Damj()

Retourne une date vide

 

 Accesseurs

Vrai/Faux

estSignificatif()

retourne Vrai si la date n’est pas vide et différente de Date mini ou de date maxi

Vrai/Faux

estDATE_MINI()

Vrai/Faux

estDATE_MAXI

int

getAnnée()

Retourne l’année

int

getMois()

Retourne le mois

int

getJour()

Retourne le jour

int

getJourDeLaSemaineEnt()

Retourne le jour de la semaine (sous forme d’une constante nommée LUNDI … DIMANCHE)

string

getJourDeLaSemaineCar()

Retourne le jour de la semaine (sous forme d’une chaîne de caractères) correspondant à la date

 

 

 

Traitement des jours julien

int

versJourJulien()

Retourne le jour du calendrier julien associé à la date

Cette opération est privée 

Damj

versDamj(int leJourJulien)

Retourne la date associée au jour julien

Cette méthode, privée, est une méthode de classe

vide

versDamj(int leJourJulien, Damj laDateRetournée)

 

 

Modificateurs

void

setAnnée(int année)

Renseigne l’année (nnnn)

void

setMois(int mois)

Renseigne le mois (nn)

void

setJour()

Renseigne le jour (nn)

 

Age et anniversaire

Damj

getAnniversaire(DuréeCalendaire lAge)

Retourne la date anniversaire correspondant à la durée calendaire passée en paramètre (le nombre d’années, de mois et de jours sont positifs ou nuls).

voir aussi avancerDate()

Damj

getDateNaissance(DuréeCalendaire lAge)

Retourne la date de début de la période finissant à la date de référence et dont la durée calendaire est passée en paramètre (le nombre d’années, de mois et de jours sont positifs ou nuls)

Voir aussi reculerDate().

DuréeCalendaire

getAge(Damj dateAnniversaire)

Retourne l’âge (sous forme de durée calendaire). Lance une exception si la date anniversaire est plus petite que la date de référence

DuréeCalendaire

getDuréeCalendaire(Damj laDate)

Retourne la durée calendaire  comprise entre les deux dates

 

 Traitement des semaines

Damj

getDébutSemaineCivile()

retourne la date du LUNDI précédent immédiatement ou égal la date de référence

Damj

getFinSemaineCivile()

retourne la date du DIMANCHE suivant immédiatement ou égal la date de référence

Période

getSemaineCivileCourante()

retourne, sous forme d’une période, les dates de début (LUNDI) et de fin (DIMANCHE) de la semaine à laquelle appartient la date de référence

Période

getSemaineCivileSuivante()

retourne, sous forme d’une période, les dates de début (LUNDI) et de fin (DIMANCHE) de la semaine qui suit immédiatement la date de référence

Période

getSemaineCivilePrécédente()

retourne, sous forme d’une période, les dates de début (LUNDI) et de fin (DIMANCHE) de la semaine qui précède immédiatement la date de référence

Période

getSemaine()

retourne, la période débutant à la date de référence et finissant 7 jours (durée calendaire) plus tard

Période

getSemainePrécédente()

retourne, la période débutant 7 jours (durée calendaire) avant la date de référence et finissant à la date de référence

int

GetJourDeLaSemaineInt(Damj laDate)

retourne, sous forme d’un entier, le jour de la semaine

(0= Lundi … 6 = Dimanche  

char

GetJourDeLaSemaineChar(Damj laDate)

retourne, sous forme caractères, le jour de la semaine

  

 


 

Traitement des mois

Damj

getDébutMois(Damj laDate)

Retourne la date de début du mois civil

Damj

getFinMois(Damj laDate)

Retourne la date de la fin du mois civil

Damj

getFinMoisPrécédent(Damj laDate)

Retourne la date de la fin du mois précédant la date de référence

Damj

getDébutMoisSuivant(Damj laDate

Retourne la date de début du mois suivant

boolean

isDébutDeMois()

retourne vrai si la date est un début de mois

boolean

isFinDeMois()

retourne vrai si la date est une fin de mois

Période

getMoisCivilCourant(Damj laDate)

Retourne le mois englobant la date de référence

Période

getMoisCivilSuivant(Damj laDate)

Retourne le mois suivant

(période = premier du mois suivant / fin du mois suivant)

Période

getMoisCivilPrécédent(Damj laDate)

Retourne le mois précédent

(période = premier du mois précédent / fin du mois précédent)

Période

getMoisSuivant(Damj laDate)

retourne la période d’un mois débutant à la date de référence et finissant à la veille du premier anniversaire de 1 mois de la date de référence

exemples :

17/12/aaaa => 16/01/aaaa+1

31/01/aaaa => dernier jour de février de la même année

31/03/aaaa => dernier jour d’avril

Période

getMoisPrécédent(Damj laDate)

retourne la période d’un mois débutant au lendemain du premier anniversaire de 1 mois précédant la date de référence et finissant à la date de référence

exemple :

17/12/aaaa => 18/11/aaaa

 

 Traitement des trimestres civils

Damj

getDébutTrimestreCivil(Damj laDate)

Retourne la date de début du trimestre civil

Damj

getFinTrimestreCivil(Damj laDate)

Retourne la date de la fin du trimestre civil civil

Damj

getFinTrimestreCivilPrécédent(Damj laDate)

Retourne la date de la fin du trimestre civil précédant la date de référence

Damj

getDébutTrimestreCivilSuivant(Damj laDate)

Retourne la date de début du trimestre civil suivant

 


 

Traitement des semestres civils

Damj

getSemestreCivil(Damj laDate)

Retourne la date de début du trimestre civil

Damj

getSemestreCivilSuivant(Damj laDate)

Retourne la date de la fin du trimestre civil civil

 

Traitement des années

Damj

getDébutAnnéeCivil()e

Retourne la date de début de l’année civile

Damj

getFinAnnéeCivile()

Retourne la date de la fin du mois civil

Damj

getFinAnnéeCivilePrécédente()

Retourne la date de la fin de l’année civile précédente la date de référence

Damj

getDébutAnnéeCivileSuivante()

Retourne la date de début de l’année civile suivante

Période

getAnnéeCivileSuivante()

Retourne l’année civile suivante

Période

getAnnéeCivilePrécédente()

Retourne l’année civile précédente

Période

getAnnéeSuivante()

retourne la période, débutant à la date de référence et finissant à la veille de son anniversaire de 1 an

exemple :

17/12/aaaa => 16/12/aaaa+1

Période

getAnnéePrécédente()

retourne la période débutant au lendemain du premier anniversaire précédant la date de référence et finissant à la date de référence

exemple ;

17/12/aaaa => 18/12/aaaa-1

boolean

isBissextile

retourne vrai si l’année est bissextile

 


 

Comparaison entre deux dates

int

compareTo(Damj uneDate)

Retourne :

.  -1 si le paramètre est plus petit que le receveur,

.  0 si le paramètre est égal au receveur,

.  +1 si le paramètre est plus grand que le receveur

boolean

estAvant(Damj d)

Retourne vrai si la date récepteur est antérieure à la date donnée en paramètre (plusPetit())

boolean

estPlusPetite(Damj d)

Retourne vrai si la date récepteur est antérieure à la date donnée en paramètre())

boolean

estAvantOuCoïncide(Damj d)

Retourne vrai si la date récepteur est antérieure ou coïncide à la date donnée en paramètre (PlusPetitOuEgal())

boolean

estPlusPetiteOuEgale(Damj d)

Retourne vrai si la date récepteur plus petite ou égale de la date donnée en paramètre

boolean

estVeilleDe(Damj d)

Retourne vrai si la date récepteur est la veille de la date donnée en paramètre

boolean

coïncideAvec(Damj d)

Retourne vrai si la date récepteur coïncide avec la date donnée en paramètre (Egal)

boolean

estEgaleA(Damj d)

Retourne vrai si la date récepteur coïncide avec la date donnée en paramètre (Egal)

boolean

estLendemainDe(Damj d)

Retourne vrai si la date récepteur est le lendemain de la date donnée en paramètre

boolean

estAprès(Damj d)

Retourne vrai si la date récepteur est postérieure à la date donnée en paramètre

boolean

estPlusGrande(Damj d)

Retourne vrai si la date récepteur est postérieure à la date donnée en paramètre (PlusGrandOuEgal)

boolean

estAprèsOuCoïncide(Damj d)

Retourne vrai si la date récepteur est postérieure ou coïncide à la date donnée en paramètre (PlusGrand)

boolean

estPlusGrandeOuEgale(Damj d)

Retourne vrai si la date récepteur est postérieure ou coïncide à la date donnée en paramètre (PlusGrand)

 


 

Comparaison entre plusieurs dates

Damj

retournerLaPlusPetite (Damj[] t)

Retourne la plus petite des dates du tableau

Damj

retournerLaPlusGrande(Damj[] t)

Retourne la grande des dates du tableau

 

 

 

 

Positionnement d’une date par rapport à une période

boolean

précède(Période p)

Retourne Vrai si la date récepteur précède la période

boolean

précèdeOuDébute(Période p)

Retourne Vrai si la date récepteur est antérieure ou égale au début de période

boolean

débute(Période p)

Retourne Vrai si la date récepteur débute la période donnée en paramètre

boolean

appartient(Période p)

Retourne Vrai si la date récepteur appartient (début ou fin inclus) la période donnée en paramètre

boolean

appartientStrictement(Période p)

Retourne Vrai si la date récepteur appartient (début et fin exclus) la période donnée en paramètre

boolean

finit(Période p)

Retourne Vrai si la date récepteur finit la période donnée en paramètre

boolean

succède (Période p)

Retourne Vrai si la date récepteur est postérieure ou égale à la fin de période

boolean

succède(Période p)

Retourne Vrai si la date récepteur est postérieure à la fin de période

boolean

succèdeOuFinit(Période p)

Retourne Vrai si la date récepteur est postérieure à la fin de période

 

 

 

Détermination du nombre de jours entre deux dates

int

getJoursEntre(Damj d)

Retourne le nombre de jours (toujours positif) entre la date récepteur et la date paramètre (deux dates égales ont une duréeJours égale à 0)

int

getJoursOuvrables(Damj d)

Retourne le nombre de jours ouvrables (toujours positif), entre la date récepteur et la date paramètre

DuréeCalendaire

getDuréeCalendaire(Damj d)

retourne la durée calendaire comprise entre les deux dates (deux dates égales ont 0, 0, 0 pour durée calendaire


 

Déplacement des dates

Damj

avancer(DuréeCalendaire leDéplacement)

Retourne la date avancée de la durée calendaire (>= 0) indiquée. Une durée calendaire égale à (0, 0, 0) retourne la même date

Damj

avancer(Périodictié laPériodicité)

Retourne la date avancée en fonction de la périodicité demandée (Annuelle, Semestrielle, Trimestrielle, Mensuelle).

Si la date origine est une fin de mois, la date arrivée est une fin de mois

Damj

reculer(DuréeCalendaire leDéplacement)

Retourne la date reculée de la durée calendaire (>= 0) indiquée. Une durée calendaire égale à (0, 0,0) retourne la même date

Période

getPériodeAvecDébutReculéDe(DuréeCalendaire dc)

Retourne la période débutant à la date de référence reculée de la durée calendaire donnée en paramètre et finissant à la date de référence

 

Détermination de périodes à partir d’un date et d’une durée calendaire

Période

getPériodeAvecFinAvancéeDe(DuréeCalendaire dc)

Retourne la période débutant à la date de référence et finissant à la date de référence avancée de la durée calendaire donnée en paramètre 

Période

getPériodeAvecDébutReculéDe(DuréeCalendaire dc)

Retourne la période débutant à la date de référence reculée de la durée calendaire donnée en paramètre et finissant à la date de référence

 


Périodes

Définitions

Intervalle de temps compris entre deux dates calendaires, une date de début et une date de fin. Par convention, les dates de début et de fin sont incluses dans la période.

 

Vocabulaire

Périodes jointives

Deux périodes sont jointives si la date de fin de la première correspond à la veille de la date de début de la suivante.

 

Généralités sur les périodes

Construction

Une période est comprise entre :

·       une date de début,

·       une date de fin.

 

La date mini et la date maxi sont des dates valides.

 

On peut créer une période à partir :

·       de deux dates (on s’assure que la première est plus petite ou égale à la deuxième),

·       d’une date (de début ou de fin) et d’un nombre de jours,

·       d’une date (de début ou de fin) et d’une durée,

·       d’une date (de début ou de fin) et d’une durée calendaire.

 

Une période, déterminée à partir d’une date et d’une durée, non valide lance une exception.

 

Période limite dans le système d’information

La période, allant de la date mini à la date maxi, est autorisée.

 

Durée d’une période

La durée d’une période correspond au nombre de jours qui s’écoulent entre sa date de début et sa date de fin (bornes incluses). Une période débutant et finissant à la même date a une durée d’un jour.

 


Typologie des opérations sur les périodes

On distingue des opérations :

·       de construction,

·       de présentation,

·       d’accession aux composants élémentaires,

·       de détermination de la durée entre deux dates,

·       de déplacement de dates, vers l’avant, vers l’arrière,

·       de détermination de la situation relative à une autre date, à une période,

·       de comparaison, recherche de la plus petite (la plus grande) date d’un ensemble de dates,

 

Saisie et présentation des périodes

La saisie et la présentation à l’écran des périodes sont normalisées ; elles peuvent faire l’objet de « préférences ».

 

Comparaison entre deux périodes

La comparaison entre deux périodes, bornes incluses, définit leur position relative :

·       Finit avant (est avant)

·       Débute avant et finit dans

·       Débute avant et finit après (englobe)

·       Débute dans et finit dans (est englobée)

·       Débute dans et finit après

·       Débute après (est après)

 

Des éléments de positionnement complémentaires permettent de tenir compte des bornes des périodes :

·       coïncide,

·       jointive avant,

·       jointive après,

·       débute le même jour que,

·       finit le même jour que

 

Interfaces implémentés

Les interfaces sérialisable, cloneable et comparable sont implémentés.

 

Remarque générales de performance

Les opérations, autres que constructeurs, qui retournent une date ou une période peuvent avoir une version dans laquelle la variable retournée est un paramètre d’appel afin d’éviter la création d’un nouvel objet.

 


Opérations sur les périodes

 

Constructeurs

 

Periode(Damj débutPériode, Damj finPériode)

Retourne une période à partir de deux dates

Lance une exception si la date de fin est antérieure à la date de début

 

Periode()

Retourne une période dont les dates de début et de fin ne sont pas significatives

 

Période(DamjlaDateDeDébut, TypePériodeEnum)

Retourne une période :

indéterminée :

si le type de période est indéterminée (date de fin = DateMaxi

instantanée :

si le type de période est instantanée (date de fin non significative)

 

Période(Damj laDateDeDébut, int laDurée)

Retourne une période à partir d’une date de début et d’une durée (avec durée >= 1)

Lance une exception si la durée est inférieure à 1

 

Période(int laDurée, Damj laDateDeFin)

Retourne une période à partir d’une durée (avec durée >= 1) et d’une date fin

Lance une exception si la durée est inférieure à 1

 

Période(Damj laDateDeDébut, int laDurée)

DuréeCalendaire laDuréeCalendaire

Retourne une période à partir d’une date de début et d’une durée calendaire

 

Période(DuréeCalendaire laDuréeCalendaire)

Damj laDateDeFin)

Retourne une période à partir d’une durée calendaire et d’une date de fin

 

Accesseurs

Vrai/Faux

estSignificative()

Retourne Vrai si les dates de début et de fin sont significatives (avec date de fin différente de DateMaxi)

Vrai/Faux

estIndéterminée()

Retourne Vrai si la date de début est significative et la date de fin = DateMaxi)

Vrai/Faux

estInstantanée

Retourne Vrai si la date de début est significative et la date de fin n’est pas significative

Vrai/Faux

estNonDéterminée()

Retourne Vrai si la date de début et la date de fin ne sont pas  significatives

Damj

getDébut()

Retourne la date de début de la période

Damj

getFin()

Retourne la date de fin de la période

int

getDurée()

Retourne la durée de la période (bornes incluses)

(supérieure ou égale à 1)

int

getNombreDeJours()

Retourne le nombre de jours entre le début et la fin de la période

 


 

 

Modificateurs

void

setDébut(Damj d)

Renseigne la date de début de la période

void

setFin(Damj d)

Renseigne la date de fin de la période

 

 

Comparaison entre une période et une date

boolean

estAprès(Damj d)

retourne Vrai si la date est antérieure au début de la période

boolean

commenceAvec(Damj d)

retourne Vrai si la date et le début de la période coïncident

boolean

débuteAuLendemain(Damj d)

retourne Vrai si la date est la veille du début de la période

boolean

finitAvec(Damj d)

retourne Vrai si la date et la fin de la période coïncident

boolean

finitLaVeilleDe(Damj d)

retourne Vrai si la date est le lendemain de la fin de la période

boolean

estAvant(Damj d)

retourne Vrai la date est postérieure à la date de fin de fin de la période

boolean

contient(Damj d)

retourne Vrai si la date est dans la période (bornes incluses)

boolean

contientStrictement(Damj d)

retourne Vrai si la date est dans la périodes (bornes exclues)

 


 

 

 Position relative entre deux périodes

boolean

estAvant(Période p)

retourne Vrai si la fin de la période récepteur est avant le début de la période paramètre

boolean

débuteAvantEtFinitDans (Période p)

retourne Vrai si :

la date de début de la période récepteur est avant la date de début de la période paramètre ET la date de fin de la période récepteur appartient à la période paramètre (bornes incluses)

boolean

englobe(Période p)

retourne Vrai si le début de la période récepteur est avant le début de la période paramètre et la date de fin de la période récepteur est après la date de fin de la période paramètre

boolean

coïncideAvec(Période p)

retourne Vrai si le début de la période récepteur coïncide avec le début de la période paramètre ET la fin de la période récepteur coïncide avec la fin de la période paramètre

boolean

estEnglobée(Période p)

Retourne vrai si la date de début de la période récepteur appartient à la période paramètre et si la date de fin de la période récepetur appartient à la période paramètre

boolean

débuteDansEtFinitAprès(Période p)

retourne Vrai si le début de la période récepteur appartient à la période paramètre ET la date de fin de la période récepteur est après la date de fin de la période paramètre

boolean

estAprès (Période p)

retourne Vrai si le début de la période récepteur est après la date fin de la période paramètre

 

Position relative entre deux périodes :  Situations aux bornes

boolean

estJointiveAvant(Période p)

retourne Vrai si la fin de la période récepteur est la veilledu début de la période paramètre

boolean

estJointiveAprès(Période p)

retourne Vrai si le début de la période récepteur est le lendemain de la fin la période paramètre

 

Modification de période

Période

avancer(DuréeCalendaire leDéplacement)

avance le début et la fin de la période de la durée calendaire donnée en paramètre

Période

avancer(Périodictié laPériodicité)

Retourne la périodet avancée en fonction de la périodicté demandée (Annuelle, Semestrielle, trimestrielle)

Période

reculer(DuréeCalendaire leDéplacement)

recule le début et la fin de la période de la durée calendaire donnée en paramètre


Durées calendaires

Objectifs

La notion de durée calendaire est introduite pour rendre compte des dispositifs réglementaires concernant la détermination :

·       de l’âge à une date (exprimé en années ou en années et mois),

·       des anniversaires,

·       des faits périodiques,

·       des périodes de références et des délais exprimés :

·         en année,

·         en année et en mois et en jours,

·         en jours.

 

Définition

Une durée calendaire est exprimée par un triplet : année, mois, jours.

 

La durée calendaire comprise entre deux dates correspond au nombre d’années, de mois et de jours qui s’écoulent entre ces deux dates. La durée calendaire entre deux dates identiques est de 0 année, 0 mois, 0 jour.

 

Caractéristiques

Les éléments de la durée calendaire sont exprimés par des nombres entiers positifs ou nuls.

 

Détermination d’une date à partir d’une date et d’une durée calendaire

On détermine :

·       la date anniversaire correspondant au nombre d’années de la durée calendaire,

·       à partir de cette date, la date anniversaire correspondant au nombre de mois de la durée calendaire,

·       à partir de cette dernière date, on détermine la fin de la période débutant à cette date et dont le nombre de jours correspond au nombre de jours de la durée calendaire

 

Le mois calendaire peut être supérieur à 12, auquel cas on modifie la durée calendaire pour tenir compte du nombre d’années et avoir un nombre de mois inférieur à 12. Par exemple si l’on veut ajouter 18 mois à une date, la durée calendaire prise en considération sera de 1 ans et 6 mois.

 

Les jours calendaires peuvent avoir n’importe quelle valeur positive. Il n’y a pas de transformation en mois ou en année.

 

Restitution d’une durée calendaire entre deux dates

La durée calendaire entre deux dates est exprimée en année, en mois (inférieur ou égal à 12) et en jours (inférieur ou égal à 31).

 

Règle de non correspondance entre dates anniversaires

Pour les âges exprimés en années ou en années et mois, si le jour de départ n’a pas de correspondance dans le mois arrivée (déplacement vers l’avant), on prend pour jour arrivée le dernier jour du mois arrivée.

Exemples :

Départ = 29 02 2004 ; Age = 1 an ; Arrivée = 28 02 2005.

Départ = 31 03 2001 ; Age = 1 an 1 mois ; Arrivée = 30 04 2002.

 

Règle particulière aux faits consommables périodiques à durée instantanée

Un fait consommable périodique, à durée instantanée, sera reconduit à une fin de mois, s’il prend effet à une fin de mois.

 

Remarque sur les âges

L’âge entre deux dates ou l’âge d’une période peut être exprimé sous forme de durée calendaire.

 

Dans cette restitution :

·       le nombre de mois est inférieur ou égal à 12,

·       le nombre de jours est inférieur ou égal à 31.

 

Comparaisons entre durées calendaires

L’opération de comparaison entre deux durées calendaires n’a pas de sens.

 

Typologie des opérations

On distingue des opérations :

·       de construction,

·       de présentation,

·       d’accession aux composants élémentaires, à la veille, au lendemain…),

 


Annexe : Opérations sur les durées calendaires

 

Constructeur

 

DuréeCalendaire()

retourne une durée calendaire de 0 année, 0 mois, 0 jour)

 

DuréeCalendaire(int ans, int mois, int jours)

retourne une durée calendaire.

Lance une exception si l’un des trois paramètres est négatif

 

Accesseurs

int

getAnnéesCalendaires()

int

getMoisCalendaires()

int

getJoursCalendaires()

DuréeCalendaire

getDuréeCalendaireCanoniqu

A partir d’une durée calendaire telle que :

   mois > 0   et / jours > 0

retourne la durée « canonique » ;

   mois <= 12 et    jours <= 31  

 

Modificateurs

 

setAnnéesCalendaires(int ans)

 

 

setMoisCalendaires(int mois)

 

 

setJoursCalendaires(int jours)

 

 

 

Traitement des durées calendaires

 

Il n’y a pas d’opération à partir des durées calendaires.

Les durées calendaires interviennent dans les opérations sur les dates :

. getDuréeCalendaire (Damj d)

. getAnniversaire(DuréeCalendaire lAge)

. avancerDate()

. getDateNaissance(DuréeCalndaire lAge)

. reculerDate()

. getAge(Damj dateAnniversaire()

 

 

Annexe : Comparaisons entre dates et périodes

Légende

D = Date de référence

D----F = ¨Période de référence

V= Veille de la date de référence

L = Lendemain de la date de référence

VD = Veille du début de la période de référence

LF = Lendemain de la fin de la période de référence

x        = Date quelconque

x = <une date remarquable>

 

Comparaison entre 2 dates (D/D)

D

D.comparer(Damj x)

      x

estAprès

                            x=V

estLendemainDe       

                              x=D

coïncideAvec

                                 x=L

estVeilleDe

                                               x

estAvant        

Comparaison entre une date et une période (D/P)

D

D.comparer(p)

d=x-------f=x

estAprès

               d=x-------f=V

estJointiveAprès

                 d=x-------f=D

finit

                         d=x------f=x

estEnglobéePar

                                 d=D-------f=x

débute

                                   d=L-------f=x

estJointiveAvant

                                          d=x-------f=x

estAvant

 

Comparaison entre une période et une date (P/D)

D---------F

pr.comparer(Damj d)

   x

estAprès

                       x=VD

débuteAuLendemainDe

                         x=D

débuteAvec

                                   x

englobe (bornes comprises)

                                   x

englobeStrictement

 (bornes exclues)

                                        x=F

finitAvec

                                           x=LF

finitLaVeilleDe

                                                         x

estAvant

   

Comparaison entre deux périodes

D---------F

pr.comparer(Période p)

   d=x-------f=x

estAprès

   d=x--------------f=VD

estJointiveAprès

   d=x--------------------f=x

débuteDansEtFinitAprès

   d=x---------------------------f=F

débuteDansEtFinitAvec

   d=x---------------------------------------f=x

débuteDansEtFinitDans

estEnglobée

                           d=D------f=x

débuteAvecEtFinitAprès

                           d=D--------f=F

débuteAvecEtFinitAvec

coîncide

                           d=D--------------f=x

débuteAvecEtFinitDans

                                 d=x-----f=x

débuteAvantEtFinitAprès

englobe

                                 d=x------f=F

débuteAvantEtFinitAvec

                                 d=x-------------f=x

débuteAvantEtFinitAvant

                                                d=LF------f=x

estJointiveAvant

                                                        d= x------f=x

estAvant

 

 

 


Notes de mise en œuvre : Détermination des durées

Objectif

L’objectif est de présenter une alternative à la détermination des durées(nombre de jours d’une période ou nombre de jours entre deux dates) basée sur l’utilisation de tables.  La solution proposée passe les algorithmes de numération des dates des calendriers grégorien et julien utilisés en astronomie.

 

L’apparente diversité des solutions à options retenues (origine, plage de validité de la formule …).

 

Netographie

wikipédia

Jour julien

 

http://www.louisg.net/Formules.htm

 

http://cosmos2000.chez.com/Vendredi13/A4_fr.html

 

http://algor.chez.com/date/date.htm

 

http://christophe.lavarenne.free.fr/tagnumfr.html

Tagnumérilo  Numérotation des jours

NJ = (a*365)+(a/4) + (((m+1)*153)/5)-123 + J

NG = NJ-(a/100)+(a/400)

 

http://lwh.free.fr/pages/algo/calendriers/calendrier_gregorien.htm

jour julien

JJ = Ent(365.25 * Y) + Ent(30.6001 * (m + 1)) + DD + 1720994.5 + B

 

http://www-obs.univ-lyon1.fr/labo/fc/cdroms/docu_astro/jour_julien/jour_julien.pdf

jour julien +++

Calendrier Julien, après J.C. 1901-2099:

J = 367*Y-7*(Y+(M+9)/l2)/4+275*M/9+D+1721014

 

Les algorithmes présentés dans ce document proviennent de :

http://jean-paul.cornec.pagesperso-orange.fr/formule_jms.htm

 d’après J.Meeus : Astronomical Algorithms. William-Bell Inc., 1991, Chapitre 7

 


 Conversion d’une date du calendrier grégorien en jour julien

 

Ent = partie entière de l’expression entre crochets

Par exemple : Ent [8,99999] = 8 et Ent [-8,9999] = -8

 

Variables et paramètres

A = année

M = Mois

J= jour

JJ = jour julien

 

- 4716 = Nombre d’années entre l’origine du calendrier julien et le calendrier grégorien

30,6001 = nombre moyen de jours par mois

T = fraction du jour correspondant à HH MM SS

(non pertinent dans le cadre des applications => T = 0)

C = Millénaire

B = Correctif

 

Actions

Cas : M = 1 ou 2

A = A -1

M = M + 12

Cas : M > 2

A = A

M = M

 C = Ent(A / 100)

B = 2 – C + Ent(C/4)

 

JJ = Ent[365,25 * (A + 4716)] + Ent[30,6001 * (M + 1)] + J + T + B – 1524,5

 


Conversion jour julien en date du calendrier grégorien (Cornec)

http://jean-paul.cornec.pagesperso-orange.fr/formule_jj.htm

 

JJ = un jour julien

Frac = partie fractionnaire du résultat

 

Z = Ent(JJ+0,5) ;  F=Frac(JJ+0,5)

a = Ent [ (Z-1867216,25)/36524,25 ]

A = Z + 1 + a - Ent [ a / 4 ]

B = A + 1524

C = Ent [ (B - 122,1) / 365,25 ]

D = Ent [ 365,25 * C ]

E = Ent [ (B - D ) / 30,6001 ]

 

Détermination du jour

(nombre décimal qui peut être transformé en Jour Heure Minute si besoin est)

J = B - D - Ent [ 30,6001 * E ) + F

Détermination du mois

Cas : E < 13,5

M = E - 1

Cas : E > 13,5

M = E – 13

Détermination de l’année

Cas : M > 2,5

A = C - 4716

Cas ; M < 2,5

A = C- 4715

Jour de la semaine à partir d'un Jour Julien (à 12h UT, )

n = JJ modulo 7

Le résultat est : lundi = 0 ; mardi = 1 ; mercredi = 2...

Notes de mise en œuvre : Déplacement des dates

A, M, J sont indicés par :

·         d, pour la date départ,

·         a, pour la date d’arrivée,

·         p, pour la durée calendaire

 

Jj est le résultat de la conversion d’une date en jour julien

 

Avancement d’une date en fonction d’une durée calendaire

Déterminer l’année calendaire d’arrivée

Aa = Ad + Ap

 

Déterminer le mois calendaire d’arrivée

Ma = Md + Mp

Cas : Ma> 12

Aa = Ad + Ent(Ma / 12)

Ma = Md + Mod(Ma ;12)

Quitter

Cas : M <= 12

Aa = Ad

Ma = Md

Poursuivre

Déterminer le jour calendaire d’arrivée

Ja = Jd + Jp

Cas : Ja <= fin du mois M

Ja = Ja

Retourner (Aa, Ma, Ja)

Cas : Ja > fin de mois Ma

avancer la date (A, M, fin de mois M) de Ja

retourner la date obtenue

Avancement d’une date en fonction d’un nombre de jours

convertir la date en jour julien

ajouter le nombre de jours donné en paramètre

retourner le jour julien converti en date


Recul d’une date en fonction d’une durée calendaire

Déterminer l’année calendaire

Aa = Ad – Ap

 

Déterminer le mois calendaire d’arrivée

Ma = Md – Mp

Cas : M < 0

Aa = Aa – Ent(Ma / 12)

M = Ma – Mod(Ma ; 12)

Quitter

Cas : M <= 12

Aa = Aa

Ma = Ma

Poursuivre

Déterminer le  jour calendaire d’arrivée

Ja = Jd- Jp

Cas : Ja >= 0

retourner (Aa, Ma, Ja)

Cas : Ja < 0

reculer (A, Ma, début du mois Ma) de Ja jours

retourner la date obtenue

 

Recul d’une date en fonction d’un nombre de jours

convertir la date en jour julien

retrancher le nombre de jours donné en paramètre

retourner le jour julien converti en date