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

Last change on this file since 2743 was 2666, checked in by ansari, 20 years ago

Correction de la declaration de trunc avec extern C pour Linux, Reza 8/04/2005

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