Created
February 20, 2014 02:31
-
-
Save PhiBabin/9105994 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * \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