source: XMLIO_V2/dev/dev_rv/src/calendar_util.cpp @ 141

Last change on this file since 141 was 141, checked in by hozdoba, 13 years ago

Mise à jour depuis un autre dépôt

File size: 5.8 KB
Line 
1#include "calendar_util.hpp"
2
3
4namespace xmlioserver
5{
6   namespace date
7   {
8      /// ////////////////////// Définitions ////////////////////// ///
9
10      CDuration operator*(const double & scal, const CDuration & ddr)
11      { return (ddr * scal); }
12
13      CDuration operator-(const CDuration & ddr , const CDuration & dr)
14      {
15         CDuration dur(ddr);
16         dur.year -= dr.year;  dur.month  -= dr.month ; dur.day    -= dr.day;
17         dur.hour -= dr.hour;  dur.minute -= dr.minute; dur.second -= dr.second;
18         return (dur);
19      }
20
21      CDuration operator+(const CDuration & ddr , const CDuration & dr)
22      {
23         CDuration dur(ddr);
24         dur.year += dr.year;  dur.month  += dr.month ; dur.day    += dr.day;
25         dur.hour += dr.hour;  dur.minute += dr.minute; dur.second += dr.second;
26         return (dur);
27      }
28
29      CDuration operator*(const CDuration & ddr , const double & scal)
30      {
31         CDuration dur(ddr);
32         dur.year *= scal;  dur.month  *= scal; dur.day    *= scal;
33         dur.hour *= scal;  dur.minute *= scal; dur.second *= scal;
34         return (dur);
35      }
36
37      CDuration operator-(const CDuration & ddr)
38      {
39         CDuration dur(ddr);
40         dur.year = -dur.year;  dur.month  = -dur.month ; dur.day    = -dur.day;
41         dur.hour = -dur.hour;  dur.minute = -dur.minute; dur.second = -dur.second;
42         return (dur);
43      }
44
45      //-----------------------------------------------------------------
46
47      CDate operator+(const CDate & dt, const CDuration & dr)
48      {
49         CDuration drr (dr);
50         int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
51         const CCalendar & c = dt.getRelCalendar();
52
53         drr.resolve(dt.getRelCalendar());
54
55         // Ajustement des minutes par rapport aux secondes.
56         second += dt.getSecond() + drr.second;
57         if (second <  0) { minute --; second += c.getMinuteLength(); }
58         if (second >= c.getMinuteLength()) { minute ++; second -= c.getMinuteLength(); }
59
60         // Ajustement des heures en fonction des minutes.
61         minute += dt.getMinute() + drr.minute;
62         if (minute < 0) { hour --; minute += c.getHourLength(); }
63         if (minute >= c.getHourLength()) { hour ++; minute -= c.getHourLength(); }
64
65         // Ajustement des jours en fonction des heures.
66         hour += dt.getHour() + drr.hour;
67         if (hour <  0) { drr.day --; hour += c.getDayLength(); }
68         if (hour >= c.getDayLength()) { drr.day ++; hour -= c.getDayLength(); }
69
70         // Ajustement des mois en fonction des jours.
71         int signVal = drr.day/fabs(drr.day);
72         CDate dtt(dt); dtt.addMonth (signVal);
73
74         for(; c.getMonthLength(dtt) < fabs(drr.day); dtt.addMonth (signVal))
75         { drr.day -= signVal * c.getMonthLength(dtt); drr.month += signVal; }
76
77         day += dt.getDay() + drr.day;
78         if (day <  0) { drr.month --; day += c.getMonthLength(dtt); }
79         if (day >= c.getMonthLength(dtt)) { drr.month ++; day -= c.getMonthLength(dtt); } // << ProblÚme ici
80         if (day == 0) day = c.getMonthLength(dtt);
81
82         drr.resolve(dt.getRelCalendar());
83
84         // Ajustement des années en fonction des mois.
85         month += dt.getMonth() + drr.month;
86         if (month <  0) { year --; month += c.getYearLength(); }
87         if (month >= c.getYearLength()) { year ++; month -= c.getYearLength(); }
88         if (month == 0) month = c.getYearLength();
89
90         year += dt.getYear() + drr.year;
91
92         return (CDate(dt.getRelCalendar(), year, month, day, hour, minute, second));
93      }
94
95      CDate operator-(const CDate & dt, const CDuration & dr) { return (dt + (-dr)); }
96
97      //-----------------------------------------------------------------
98
99      CDuration operator-(const CDate & dt0, const CDate & dt1)
100      {
101         // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
102         CDuration dur =
103         { dt0.getYear() - dt1.getYear(), dt0.getMonth()  - dt1.getMonth() , dt0.getDay()    - dt1.getDay(),
104           dt0.getHour() - dt1.getHour(), dt0.getMinute() - dt1.getMinute(), dt0.getSecond() - dt1.getSecond() };
105         return (dur.resolve(dt0.getRelCalendar()));
106      }
107
108      //-----------------------------------------------------------------
109
110      /// Les opérateurs de comparaison. (Non testés pour le moment)
111      bool operator==(const CDate& dt0, const CDate& dt1)
112      {
113         // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
114         return ((dt0.getYear() == dt1.getYear()) && (dt0.getMonth()  == dt1.getMonth())  && (dt1.getDay()    == dt0.getDay()) &&
115                 (dt0.getHour() == dt1.getHour()) && (dt0.getMinute() == dt1.getMinute()) && (dt1.getSecond() == dt0.getSecond()));
116      }
117
118      bool operator< (const CDate& dt0, const CDate& dt1)
119      {
120         // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
121         if (dt0.getYear()   < dt1.getYear())   return true; if (dt0.getMonth()  < dt1.getMonth())  return true;
122         if (dt0.getDay()    < dt1.getDay())    return true; if (dt0.getHour()   < dt1.getHour())   return true;
123         if (dt0.getMinute() < dt1.getMinute()) return true; if (dt0.getSecond() < dt1.getSecond()) return true;
124         return false;
125      }
126
127      //-----------------------------------------------------------------
128
129      bool operator!=(const CDate & dt0, const CDate & dt1){ return !(dt1 == dt0); }
130      bool operator> (const CDate & dt0, const CDate & dt1){ return (dt1 < dt0); }
131      bool operator>=(const CDate & dt0, const CDate & dt1){ return ((dt0 > dt1) || (dt1 == dt0)); }
132      bool operator<=(const CDate & dt0, const CDate & dt1){ return ((dt0 < dt1) || (dt1 == dt0)); }
133
134      ///----------------------------------------------------------------
135
136   } // namespace date
137} // namespace xmlioserver
138
139
140
141
142
143
Note: See TracBrowser for help on using the repository browser.