// cDate.cpp Date du jour et quelques manipulations
// > Cdate: une classe
// > Date courante, jour, mois, année, heure, minute, seconde
// > Nombre de jours entre deux dates, date n jours plus tard
// > Année bissextile
// > Calendriers d'un mois, d'une année
// auteur: R.Astier
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
#include
#include
#include
using namespace std;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
// fichier: cDate.h
#ifndef CDATE_H
#define CDATE_H
typedef int tCalMois[6][7]; // calendrier mensuel
typedef char tChCalMois[7][7][4]; // cal. mensuel: tableau de chaînes
typedef char tChCalAnnee[4000]; // cal.annuel: une chaîne (des R/C)
class cDate {
public:
// Noms des mois et des jours de la semaine
static const char* mois[];
static const char* jours[];
// Instant présent (de l'appel)
cDate () { instant=time(NULL); infos=*(localtime(&instant)); };
// Construction à partir d'un autre instant
cDate (time_t i): instant(i){ infos=*(localtime(&instant)); };
// Construction à partir de jour,mois,année m=1 pour janvier
// conditions: 1<=m<=12 ET 1900<=a
cDate (int j, int m, int a);
// Renvoie la date, exemple : ' jeudi 21 octobre 2004 (18:07:27)'
// dans une zone statique (modifiée par un autre appel à zsDate())
char * cDate::zsDate();
// Renvoie la date, exemple : ' jeudi 21 octobre 2004 (18:07:27)'
// indice(longueur) des champs: 0(8), 9(2), 12(9), 22(4), 28(2),31(2),34(2)
// jour et mois peuvent commencer par des blancs
string date() { return string(zsDate()); }
// Nom du jour et mois, en chaîne
const char* nomJour() { return jours[infos.tm_wday]; }
const char* nomMois() { return mois[infos.tm_mon]; }
// Jour, mois, année
// avec 5/02/2005: j()=5; m()=2; a()=2005; qa()=23
int j() { return infos.tm_mday;}
int m() { return 1+infos.tm_mon;}
int a() { return 1900+infos.tm_year;}
// Heure, minute, seconde
int hh() { return infos.tm_hour;}
int mm() { return infos.tm_min;}
int ss() { return infos.tm_sec;}
// Numéros du jour (0:dimanche), numéro du mois (0:janvier)
// quantième dans l'année
int nj() { return infos.tm_wday; }
int nm() { return infos.tm_mon;}
int qa() { return infos.tm_yday;}
// Renvoie la cDate nbJours plus tard (sans changement d'heure)
cDate jourPlusTard(int nbJours) { return cDate(instant+nbJours*JOUR); }
// Renvoie le nombre n de jours entre les dates
// n>0 si d2>cible; n<0 si cibletm_mday, // date dans le mois
nj=tmb->tm_wday, // jour semaine 0:dimanche
nm=tmb->tm_mon, // numéro du mois 0:janvier
a=1900+tmb->tm_year, // année
hh=tmb->tm_hour, // heure
mm=tmb->tm_min, // minute
ss=tmb->tm_sec, // seconde
q=tmb->tm_yday; // quantième dans l'année
*/
};
const char* cDate::mois[]= {
"janvier", "février", "mars","avril",
"mai","juin","juillet","aout",
"septembre","octobre","novembre","décembre"};
const char* cDate::jours[]={
"dimanche","lundi","mardi","mercredi",
"jeudi", "vendredi","samedi"};
#endif
// - - - - - - F i n d u f i c h i e r d ' e n t ê t e - - -+
// fichier: cDate.cpp
// Construction à partir de jour,mois,année m=1 pour janvier
// conditions: 1<=m<=12 ET 1900<=a
cDate::cDate(int j, int m, int a) {
memset(&infos,'\0',sizeof(infos)); // Tous les champs à 0
infos.tm_mday=j; infos.tm_mon=m-1; infos.tm_year=a-1900;
instant = mktime(&infos);
infos=*(localtime(&instant));
}
// Renvoie la date, exemple : ' jeudi 21 octobre 2004 (18:07:27)'
// dans une zone statique (modifiée par un autre appel à zsDate())
char * cDate::zsDate() {
static char zs[80];
// struct tm* tmb = localtime(&instant);
int j=infos.tm_mday, // date dans le mois
nj=infos.tm_wday, // numéro jour semaine 0:dimanche
nm=infos.tm_mon, // numéro du mois 0:janvier
a=1900+infos.tm_year, // année
hh=infos.tm_hour, // heure
mm=infos.tm_min, // minute
ss=infos.tm_sec; // seconde
// int q=infos.tm_yday; // quantième dans l'année
ostrstream da(zs,sizeof(zs));
da.setf(ios::right,ios::adjustfield);
da.width(8);
da << jours[nj] << " ";
da.fill('0'); da.width(2); da<d1.instant) apres=1;
else delta=d1.instant-d2.instant;
return apres*(delta/cDate::JOUR);
}
//
int cDate::bissextile() {
cDate dd(29,2,a());
return dd.j()==29;
}
int cDate::bissextile(int aa) {
cDate dd(29,2,aa); // 29 février
return dd.j()==29; // le quantième est-il 29?
}
//
int cDate::calendrierMois(int m, int a, int t[6][7], char c[7][7][4]) {
int nlt; // nb.lignes utilisées dans t
cDate dm=cDate(1,m,a); // le premier du mois
int ms,as; // mois suivant, et année
if(m<12) { ms=m+1; as=a;}
else { ms=1; as=a+1;}
int njm=dm.nJours(cDate(1,ms,as)); // nombre de jours dans le mois
int i,q, j=dm.nj();
if(j==0) j=6; else j--; // pour dimanche en dernière colonne
for(q=0; q0) {
if(q>9) c[i][j][1]='0'+q/10; // 2 chiffres
c[i][j][2]='0'+q%10; // unité
}
}
}
return nlt;
}
// Fournit 12 tableaux des dates par mois sous forme numérique et une
// chaîne
void cDate::calendrierAnnee(int a, tCalMois t[12], tChCalAnnee c) {
int m;
for(m=1; m<13; m++) calendrierMois(m,a,t[m-1]);
if(c==NULL) return;
ostrstream fs(c,sizeof(tChCalAnnee));
int q, ia,ja,im,jm; char aSep[]=" | " ;
char tj[][4]= {" Lu"," Ma"," Me"," Je"," Ve"," SA", " DI"};
for(im=1; im<13; im+=3) {
// Noms des mois d'un trimestre
for(jm=im; jm > > "; cin.getline( new char[80],80);
return 0;
}
//fin cDate.cpp