Skip to content

Instantly share code, notes, and snippets.

@PhiBabin
Created February 20, 2014 02:31
Show Gist options
  • Select an option

  • Save PhiBabin/9105994 to your computer and use it in GitHub Desktop.

Select an option

Save PhiBabin/9105994 to your computer and use it in GitHub Desktop.
/**
* \file Date.cpp
* \brief Implantation de la classe Date
* révision : normes 03-2013
* balises Doxygen
* révision des commentairs d'en-tête des méthodes
* \author Yves Roy Version initiale, THE
* \date 10 octobre 2013
* \version 3.2 sans contrat
*/
// dernière modification : 2014-02-06
#include "Date.h"
#include <sstream>
#include <ctime>
#include <iostream>
static const long MAX_SECONDE = 2145848400;
static const long JOUR_EN_SECONDES = 60 * 60 * 24;
static const long MIN_SECONDE = 5 * 60 * 60; // 5 heure par rapport à Greenwich
using namespace std;
namespace util
{
/**
* \brief constructeur par défaut \n
* La date prise par défaut est la date du système
*/
Date::Date()
{
const time_t t = time(NULL);
struct tm* infoTempsP = localtime(&t);
asgDate(infoTempsP->tm_mday, infoTempsP->tm_mon + 1,
infoTempsP->tm_year + 1900);
}
/**
* \brief constructeur avec paramètres
* On construit un objet Date à partir de valeurs passées en paramètres.
* \param[in] p_jour est un entier long qui représente le jour de la date
* \param[in] p_mois est un entier long qui représente le mois de la date
* \param[in] p_annee est un entier long qui représente l'année de la date
*/
Date::Date(long p_jour, long p_mois, long p_annee)
{
asgDate(p_jour, p_mois, p_annee);
}
/**
* \brief Assigne une date à l'objet courant
* \param[in] p_jour est un entier long qui représente le jour de la date
* \param[in] p_mois est un entier long qui représente le mois de la date
* \param[in] p_annee est un entier long qui représente l'année de la date
*/
void Date::asgDate(long p_jour, long p_mois, long p_annee)
{
this->m_year = p_annee;
this->m_mon = p_mois;
this->m_day = p_jour;
this->m_hour = 0;
this->m_min = 0;
this->m_sec = 0;
}
/**
* \brief Ajoute ou retire un certain nombre de jours à la date courante
* \param p_nbJour est une entier long qui représente le nombre de jours à ajouter ou à soustraire s'il est négatif
* \return un booléen qui indique si l'opération a réussi ou non
*/
bool Date::ajouteNbJour(long p_nbJour)
{
long j = p_nbJour + m_day;
int neg = p_nbJour >= 0 ? 1 : -1;
while((estBissextile(m_year) and (j -neg)/ 366 != 0) or (!estBissextile(m_year) and (j -neg)/ 365 != 0))
{
//cout<<j<<endl;
m_year += neg;
j -= (estBissextile(m_year)? 366 : 365) * neg;
}
long JourParMois[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if(j >= 0)
while(j > JourParMois[m_mon - 1]){
// On rajoute un 29 février si bissextile
if(estBissextile(m_year))
JourParMois[1] = 29;
else
JourParMois[1] = 28;
j -= JourParMois[m_mon - 1];
m_mon++;
if(m_mon == 13){
m_mon = 1;
m_year++;
}
else if(m_mon == 0){
m_mon = 12;
m_year--;
}
}
else{
while(j <= 0){
if(estBissextile(m_year))
JourParMois[1] = 29;
else
JourParMois[1] = 28;
j += JourParMois[m_mon - 1];
m_mon--;
if(m_mon == 13){
m_mon = 1;
m_year++;
}
else if(m_mon == 0){
m_mon = 12;
m_year--;
}
}
}
m_day = j;
return true;
}
bool Date::majorite()
{
Date now;
Date major(m_day, m_mon, m_year + 18);
return major < now;
}
/**
* \brief retourne le jour de la date
* \return un entier long qui représente le jour de la date
*/
long Date::reqJour() const
{
return m_day;
}
/**
* \brief retourne le mois de la date
* \return un entier long qui représente le mois de la date
*/
long Date::reqMois() const
{
return m_mon;
}
/**
* \brief retourne l'année de la date
* \return un entier long qui représente l'année de la date
*/
long Date::reqAnnee() const
{
return m_year;
}
/**
* \brief retourne le numéro correspondant au jour de la date
* \return un entier long qui représente le numéro correspondant au jour de la date
*/
long Date::reqJourAnnee() const
{
long JourParMois[] =
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
long j = m_day;
for(int i = 0; i < this->m_mon - 1; i++){
j += JourParMois[i];
}
if(estBissextile(m_year))
j++;
return j;
}
/**
* \brief Déterminer si une année est bissextile ou non
* \param[in] p_annee un entier long qui repréente l'année à vérifier
* \return estBissextile un booléen qui a la valeur true si l'année est bissextile et false sinon
*/
bool Date::estBissextile(long p_annee)
{
bool estBissextile = false;
if (((p_annee % 4 == 0) && (p_annee % 100 != 0)) || ((p_annee % 4 == 0) && (p_annee
% 100 == 0) && (p_annee % 400 == 0)))
{
estBissextile = true;
}
return estBissextile;
}
/**
* \brief retourne le nom du jour de la semaine en français
* \return une chaîne de caractères qui représente le nom du jour de la semaine en français
*/
string Date::reqNomJourSemaine() const
{
static string JourSemaine[] =
{ "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" };
Date then(1,1,1900);
return JourSemaine[(*this - then) % 7];
}
/**
* \brief retourne le nom du mois en français
* \return une chaîne de caractères qui représente le nom du mois en français
*/
string Date::reqNomMois() const
{
static string NomMois[] =
{ "janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout",
"septembre", "octobre", "novembre", "decembre" };
return NomMois[m_mon - 1];
}
/**
* \brief retourne une date formatée dans une chaîne de caracères (string)
* \return une date formatée dans une chaîne de caractères
*/
string Date::reqDateFormatee() const
{
ostringstream os;
os << reqNomJourSemaine() << " le ";
if (reqJour() < 10)
{
os << "0";
}
os << reqJour() << " ";
os << reqNomMois() << " ";
os << reqAnnee();
return os.str();
}
/**
* \brief Vérifie la validité d'une date
* \param[in] p_jour un entier long représentant le jour de la date
* \param[in] p_mois un entier long représentant le mois de la date
* \param[in] p_annee un entier long représentant l'année de la date
* \return un booléen indiquant si la date est valide ou non
*/
bool Date::validerDate(long p_jour, long p_mois, long p_annee)
{
long JourParMois[] =
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
bool valide = false;
if (p_mois > 0 && p_mois <= 12)
{
if (p_mois == 2 && Date::estBissextile(p_annee))
{
JourParMois[p_mois - 1]++;
}
if (p_jour > 0 && p_jour <= JourParMois[p_mois - 1])
{
valide = true;
}
}
return valide;
}
/**
* \brief surcharge de l'opérateur ==
* \param[in] p_date qui est une date valide
* \return un booléen indiquant si les deux dates sont égales ou pas
*/
bool Date::operator==(const Date& p_date) const
{
return m_year == p_date.m_year and m_mon == p_date.m_mon and
m_day == p_date.m_day and m_hour == p_date.m_hour and
m_min == p_date.m_min and m_sec == p_date.m_sec;
}
/**
* \brief surcharge de l'opérateur <
* \param[in] p_date qui est une date valide
* \return un booléen indiquant si la date passée en paramètre est plus petite que la date courante
*/
bool Date::operator<(const Date& p_date) const
{
if( m_year < p_date.m_year)
return true;
else if(m_mon < p_date.m_mon)
return true;
else if(m_day < p_date.m_day)
return true;
else if(m_hour < p_date.m_hour)
return true;
else if(m_min < p_date.m_min)
return true;
else if(m_sec < p_date.m_sec)
return true;
return false;
}
/**
* \brief retourne le nombre de jours entre deux dates
* \param[in] p_date qui est une date valide
* \return un entier qui représente le nombre de jours entre les deux dates
*/
int Date::operator-(const Date& p_date) const
{
long j = reqJourAnnee() - p_date.reqJourAnnee();
if(p_date.m_year > m_year or (p_date.m_year == m_year and j < 0))
return -(p_date - *this);
for(int i = 0; i < m_year - p_date.m_year; i++)
j += (estBissextile(m_year + i)? 366 : 365);
return j;
}
/**
* \brief surcharge de la fonction << d'écriture dans une ostream
* \param[in] p_os une stream vide dans laquelle on va écrire
* \param[in] p_date qui est une date valide
* \return la stream dans laquelle on a écrit la date
*/
ostream& operator<<( ostream& p_os, const Date& p_date)
{
long jour = p_date.reqJour();
long mois = p_date.reqMois();
if (jour < 10)
{
p_os << "0";
}
p_os << jour << "/";
if (mois < 10)
{
p_os << "0";
}
p_os << mois << "/";
p_os << p_date.reqAnnee();
return p_os;
}
}// namespace util
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment