retour vers la page d'accueil

STS IG 2 - année 2002/2003
TD n°10 : P.O.O. - Classe Cl_Date

SujetRetour en haut de page

Le type de donnée TDateTime permet de gérer des dates/heures comptées à partir du 30 décembre 1899 00h00m00s, ce qui peut s'avérer insuffisant. On vous demande donc de mettre en oeuvre une classe Cl_Date qui va permettre de gérer n'importe quelle date de notre ère.

Voici la partie publique de la classe :

Nom Signification
calendrier

G ou g : calendrier grégorien
J ou j : calendrier julien

remarque : pour des évolutions ultérieures, on prévoira une taille de 3 caractères pour cette propriété.

jour numéro du jour dans le mois
mois numéro du mois dans l'année
année  
heure  
minute  
seconde  
numJourSemaine 1 = lundi ... 7 = dimanche
numSemaine numéro de la semaine qui contient la date (entre 1 et 53)
date chaîne de caractère représentant la date (en lecture seule),
conformément au format ci-après
format

chaîne de caractères décrivant la représentation de la date :

J : numéro du jour sans zéro non significatif
JJ : numéro du jour avec zéro non significatif
JJJ : nom abrégé du jour de la semaine en 3 lettres
JJJJ : nom complet du jour de la semaine

M : numéro du mois sans zéro non significatif
MM : numéro du mois avec zéro non significatif
MMM : nom abrégé du mois en 3 lettres
MMMM : nom complet du mois

AA : numéro de l'année sur 2 chiffres
AAAA : numéro de l'année sur 4 chiffres

h : numéro des heures sans zéro non significatif
hh : numéro des heures avec zéro non significatif

m : numéro des minutes sans zéro non significatif
mm : numéro des minutes avec zéro non significatif

s : numéro des secondes sans zéro non significatif
ss : numéro des secondes avec zéro non significatif

$ : le caractère qui suit doit apparaître de manière litéralle

tout autre caractère est affiché de manière litéralle.

Exemple : pour le 6 mars 2003 12h05m07s,
le format "JJJ JJ/MM/AAAA à h$hm$ms$s" donne :
"jeu 06/03/2003 à 12h5m7s"

fonction comparerDate (e: dateTest : tdatetime) : entier si la date < dateTest alors la valeur renvoyée sera -1
si la date = dateTest alors la valeur renvoyée sera 0
si la date > dateTest alors la valeur renvoyée sera +1
fonction comparerHeure (e: heureTest : tdatetime): entier si l'heure < heureTest alors la valeur renvoyée sera -1
si l'heure = heureTest alors la valeur renvoyée sera 0
si l'heure > heureTest alors la valeur renvoyée sera +1
fonction comparerDateHeure (e: dateHeureTest : tdatetime): entier si la dateHeure < dateHeureTest alors la valeur renvoyée sera -1
si la dateHeure = dateHeureTest alors la valeur renvoyée sera 0
si la dateHeure > dateHeureTest alors la valeur renvoyée sera +1
procédure ajouterJours (e: nbJours : entier) ajoute nbJours à la date (éventuellement nbJours peut être négatif)

L'initialisation de l'objet utilisera la date et l'heure système.

On prendra soin d'intégrer tous les contrôles de valeurs nécessaires et de définir si les propriétés sont accessibles en lecture/écriture, en lecture seule ou en écriture seule.

On dispose d'une unité Delphi 4 implémentant quelques calculs sur les dates (un_date.dcu) dont voici la partie interface :

function AnneeJulienneBissextile (annee : word):boolean;
function AnneeGregorienneBissextile (annee : word):boolean;

function QuantiemeJulien (jour, mois, annee: word):word;
function QuantiemeGregorien (jour, mois, annee: word):word;

function DateGregorienneVersJourJulien (jour, mois, annee : word):longint;
function DateJulienneVersJourJulien (jour, mois, annee : word):longint;

procedure JourJulienVersDateJulienne (JourJulien: longint; var jour, mois, annee : word);
procedure JourJulienVersDateGregorienne (JourJulien: longint; var jour, mois, annee : word);

Si besoin est, voici la version DLL (dates.dll) de l'unité un_date avec l'entête à ajouter dans votre applications (placez la DLL dans le même dossier que votre exécutable).:

function AnneeJulienneBissextile (annee : word):boolean; stdcall; external 'dates.dll';
function AnneeGregorienneBissextile (annee : word):boolean; stdcall; external 'dates.dll';

function QuantiemeJulien (jour, mois, annee: word):word; stdcall; external 'dates.dll';
function QuantiemeGregorien (jour, mois, annee: word):word; stdcall; external 'dates.dll';

function DateGregorienneVersJourJulien (jour, mois, annee : word):longint; stdcall; external 'dates.dll';
function DateJulienneVersJourJulien (jour, mois, annee : word):longint; stdcall; external 'dates.dll';

procedure JourJulienVersDateJulienne (JourJulien: longint; var jour, mois, annee : word); stdcall; external 'dates.dll';
procedure JourJulienVersDateGregorienne (JourJulien: longint; var jour, mois, annee : word); stdcall; external 'dates.dll';

Rappels sur les calendriers :

On considèrera que le calendrier julien a cédé la place au calendrier grégorien en 1582 : le lendemain du jeudi 4 octobre 1582 était le vendredi 15 octobre 1582. Il n'y a donc aucune rupture dans les jours de la semaine.

La semaine n°1 est, de manière conventionnelle, la première semaine de l'année qui comporte un jeudi.

Le jour julien correspond à la numérotation des jours à partir du 1er janvier de l'année 4713 avant notre ère (soit 1/1/-4712 car l'année 0 de notre ère n'existe pas). Ainsi le 1/1/1965 correspond au jour julien n°2 438 762. Il n'y a aucune rupture dans cette numérotation.

Le quantième correspond au numéro d'ordre d'une date dans l'année : le 3 février 2003 porte le numéro 34.


Auteur : Jean HENRI - mars 2003 - copyright SeieS