source: Sophya/trunk/SophyaLib/BaseTools/timestamp.cc@ 2654

Last change on this file since 2654 was 2654, checked in by ansari, 21 years ago

Ajout 1ere version classe TimeStamp - Reza 11 Mars 2005

File size: 4.6 KB
Line 
1#include "sopnamsp.h"
2#include "machdefs.h"
3#include <stdio.h>
4#include <time.h>
5#include <ctype.h>
6#include <math.h>
7#include "timestamp.h"
8#include "pexceptions.h"
9#include <iostream>
10
11//-------------------------------------------------------------------------
12//-------------------------- Classe TimeStamp --------------------------
13//-------------------------------------------------------------------------
14enum Jour {jour_Lundi=0, jour_Mardi, jour_Mercredi, jour_Jeudi, jour_Vendredi, jour_Samedi, jour_Dimanche};
15enum Mois {mois_Janvier=1, mois_Fevrier, mois_Mars, mois_Avril, mois_Mai, mois_Juin, mois_Juillet,
16 mois_Aout, mois_Septembre, mois_Octobre, mois_Novembre, mois_Decembre};
17
18 /*
19 //! Day of the week enum
20 enum WeekDay {day_Monday=0, day_Tuesday, day_Wednesday, day_Thursday, day_Friday, day_Saturday, day_Sunday};
21 */
22
23TimeStamp::TimeStamp()
24{
25 mSeconds = 0.;
26 mDays = 0;
27 SetNow();
28}
29
30TimeStamp::TimeStamp(TimeStamp const & ts)
31{
32 Set(ts);
33 mSeconds = ts.mSeconds;
34 mDays = ts.mDays;
35}
36
37TimeStamp::TimeStamp(int year, int month, int day, int hour, int min, double sec)
38{
39 SetDate(year, month, day);
40 SetHour(hour, min, sec);
41}
42
43
44TimeStamp::TimeStamp(double days)
45{
46 Set(days);
47}
48
49TimeStamp::TimeStamp(string& date, string& hour)
50{
51 SetDate(date);
52 SetHour(hour);
53}
54
55TimeStamp::TimeStamp(const char* date, const char* hour)
56{
57 SetDate(date);
58 SetHour(hour);
59}
60
61
62void TimeStamp::Set(TimeStamp const & ts)
63{
64 mSeconds = ts.mSeconds;
65 mDays = ts.mDays;
66}
67
68void TimeStamp::Set(double days)
69{
70 if (days < 0.) {
71 mDays = days;
72 mSeconds = (days-mDays)*86400.;
73 }
74 else {
75 mDays = trunc(days)-1;
76 mSeconds = (days-mDays)*86400.;
77 }
78}
79
80void TimeStamp::SetNow()
81{
82 time_t t = time(NULL);
83 struct tm* TM = gmtime(&t);
84
85 int JJ,MM,AA;
86 int hh,mm;
87 double ss;
88
89 AA = TM->tm_year + 1900;
90 MM = TM->tm_mon+1;
91 JJ = TM->tm_mday;
92 hh = TM->tm_hour;
93 mm = TM->tm_min;
94 ss = TM->tm_sec;
95 SetDate(AA,MM,JJ);
96 SetHour(hh,mm,ss);
97}
98
99void TimeStamp::SetDate(int year, int month, int day)
100{
101 mDays = ConvertToDays(year, month, day);
102}
103
104void TimeStamp::SetDate(const char* date)
105{
106 int day,month,year;
107 sscanf(date,"%d/%d/%d", &day, &month, &year);
108 mDays = ConvertToDays(year, month, day);
109}
110
111void TimeStamp::SetHour(int hour, int min, double sec)
112{
113 mSeconds = hour*3600.+min*60+sec;
114}
115
116void TimeStamp::SetHour(const char* shour)
117{
118 int hour, min;
119 double sec;
120 sscanf(shour,"%d:%d:%lf",&hour, &min, &sec);
121 mSeconds = hour*3600.+min*60+sec;
122
123}
124
125void TimeStamp::GetDate(int& year, int& month, int& day) const
126{
127 int_8 jours = mDays;
128 // Recherche de l'annee
129 if (jours < 0) {
130 year = 1901;
131 while(jours < 0) {
132 year--;
133 jours += YearDays(year);
134 }
135 }
136 else {
137 year = 1901;
138 while(jours > YearDays(year)) {
139 jours -= YearDays(year);
140 year++;
141 }
142 }
143 // Recherche du mois
144 month = 1;
145 while(jours > MonthDays(year, month) ) {
146 jours -= MonthDays(year, month);
147 month++;
148 }
149 day = jours;
150}
151
152void TimeStamp::GetHour(int& hour, int& min, double& sec) const
153{
154 double seconds = mSeconds;
155 hour = trunc(seconds/3600.);
156 seconds -= hour*3600;
157 min = trunc(seconds/60.);
158 sec = seconds-min*60;
159}
160double TimeStamp::ToDays() const
161{
162 return((double)mDays + mSeconds/86400.);
163}
164
165string TimeStamp::ToString() const
166{
167 char buff[128];
168 int aa, mm, jj;
169 int hh, min;
170 double sec;
171 GetDate(aa, mm, jj);
172 GetHour(hh, min, sec);
173 sprintf(buff,"%02d/%02d/%02d %02d:%02d:%02.1f GMT", jj,mm,aa,hh,min,sec);
174 return buff;
175}
176
177void TimeStamp::Print(ostream& os) const
178{
179 os << " " << ToString() << " ";
180}
181
182int TimeStamp::MonthDays(int annee, int mois)
183{
184 if (mois<1 || mois>12) throw ParmError("TimeStamp::MonthDays month out of range");
185
186 switch(mois) {
187 case mois_Janvier:
188 case mois_Mars:
189 case mois_Mai:
190 case mois_Juillet:
191 case mois_Aout:
192 case mois_Octobre:
193 case mois_Decembre:
194 return 31;
195 case mois_Avril:
196 case mois_Juin:
197 case mois_Septembre:
198 case mois_Novembre:
199 return 30;
200 case mois_Fevrier:
201 return (((annee%4 == 0) && (annee%100 != 0)) || (annee%400 == 0)) ? 29 : 28;
202 }
203 return -1;
204}
205
206int TimeStamp::YearDays(int annee)
207// Retourne le nombre de jours dans l'année
208{
209 return (((annee%4 == 0) && (annee%100 != 0)) || (annee%400 == 0)) ? 366 : 365;
210}
211
212int_8 TimeStamp::ConvertToDays(int AA, int MM, int JJ)
213{
214 int_8 t = 0;
215 // if (!UndetDate()) {
216 int nban = AA-1901;
217 if (nban >= 0)
218 t = nban*365 + (nban/4) - (nban/100) + ((nban+300)/400);
219 else
220 t = nban*365 + (nban/4) - (nban/100) + ((nban-100)/400);
221 for (int i=1; i<MM; i++) t += TimeStamp::MonthDays(AA, i);
222 t += JJ;
223 // }
224 return t;
225}
Note: See TracBrowser for help on using the repository browser.