source: trunk/Mars/mbase/MTime.h@ 12811

Last change on this file since 12811 was 12797, checked in by tbretz, 13 years ago
Allow to feed SetSqlDateTime also with an ISO time and allow more or less than three digits after the dot
File size: 8.2 KB
Line 
1#ifndef MARS_MTime
2#define MARS_MTime
3
4/////////////////////////////////////////////////////////////////////////////
5// //
6// MTime //
7// //
8// A generalized MARS time stamp //
9// //
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef MARS_MParContainer
13#include "MParContainer.h"
14#endif
15
16#ifndef _CPP_IOSFWD
17#include <iosfwd>
18#endif
19
20#ifndef ROOT_TTime
21#include <TTime.h>
22#endif
23
24#include <TMath.h>
25
26struct timeval;
27
28class MTime : public MParContainer
29{
30public:
31 static const UInt_t kHour; // [ms] one hour
32 static const UInt_t kDay; // [ms] one day
33 static const UInt_t kDaySec; // [s] one day
34
35 enum {
36 kSunday, kMonday, kTuesday, kWednesday, kThursday, kFriday, kSaturday
37 };
38
39private:
40 UInt_t fMjd; // [d] Day in the century (Day of sun rise)
41 TTime fTime; // [ms] Time of Day (-11h<=x<13h)
42 UInt_t fNanoSec; // [ns] NanoSec part of TimeOfDay (<1000000)
43
44
45 ULong_t GetTime24() const
46 {
47 return (Long_t)fTime<0 ? (Long_t)fTime+kDay : (ULong_t)fTime;
48 }
49 void Init(const char *name, const char *title)
50 {
51 fName = name ? name : "MTime";
52 fTitle = title ? title : "Generalized time stamp";
53 }
54
55public:
56 MTime(const char *name=NULL, const char *title=NULL)
57 {
58 Init(name, title);
59 Clear();
60
61 SetSqlDateTime(name);
62 }
63 MTime(const struct timeval &tm)
64 {
65 Init(NULL, NULL);
66 Set(tm);
67 }
68 MTime(Double_t mjd);
69 MTime(UShort_t y, Byte_t m, Byte_t d, Byte_t h=13, Byte_t min=0, Byte_t s=0, UShort_t ms=0, UInt_t ns=0);
70 MTime(const MTime& t) : MParContainer(), fMjd(t.fMjd), fTime(t.fTime), fNanoSec(t.fNanoSec)
71 {
72 Init(NULL, NULL);
73 }
74
75 //static Int_t Hour() { return 3600; }
76 //static Int_t Day() { return 3600;*24 }
77
78 void operator=(const MTime &t)
79 {
80 fMjd = t.fMjd;
81 fTime = t.fTime;
82 fNanoSec = t.fNanoSec;
83 }
84
85 void Clear(const Option_t *) { Clear(); }
86 void Clear() { fMjd=0; fTime=0; fNanoSec=0; }
87
88 void Print(Option_t *t=NULL) const;
89
90 void Now();
91
92 // Setter functions
93 Bool_t Set(UShort_t y, Byte_t m, Byte_t d, Byte_t h=13, Byte_t min=0, Byte_t s=0, UShort_t ms=0, UInt_t ns=0);
94 void Set(const struct timeval &tv);
95 Bool_t SetString(const char *str);
96 Bool_t SetSqlDateTime(TString str);
97 Bool_t SetSqlTimeStamp(const char *str);
98 void SetCT1Time(UInt_t mjd, UInt_t t1, UInt_t t0);
99 void SetCorsikaTime(Float_t time);
100 Bool_t SetStringFmt(const char *time, const char *fmt, const char *loc=0);
101 Bool_t SetBinary(const UInt_t t[6]);
102 Bool_t UpdMagicTime(Byte_t h, Byte_t m, Byte_t s, UInt_t ns);
103 Bool_t SetMjd(UInt_t mjd, ULong_t ms, UInt_t ns=0);
104 void SetMjd(Double_t m);
105 void SetAxisTime(Double_t time);
106 void SetMoonPeriod(Double_t p);
107 void SetMagicPeriodStart(Int_t p);
108 void SetUnixTime(Long64_t sec, ULong64_t usec=0);
109 void SetEaster(Short_t year=0);
110
111 // Getter functions
112 Double_t GetJD() const { return GetMjd()+2400000.5; }
113 Double_t GetMjd() const;
114 Double_t GetGmst() const;
115 TString GetString() const;
116 TString GetStringFmt(const char *fmt=0, const char *loc=0) const;
117 TString GetSqlDateTime() const;
118 TString GetSqlTimeStamp() const;
119 TString GetFileName() const;
120 void GetBinary(UInt_t t[6]) const;
121 void GetDate(UShort_t &y, Byte_t &m, Byte_t &d) const;
122 MTime GetDateOfSunrise() const;
123 void GetDateOfSunrise(UShort_t &y, Byte_t &m, Byte_t &d) const;
124 TTime GetRootTime() const;
125 TDatime GetRootDatime() const;
126 Double_t GetAxisTime() const;
127 Double_t GetMoonPhase() const;
128 Double_t GetMoonPeriod() const;
129 Int_t GetMagicPeriod() const;
130 Long_t GetTime() const { return (Long_t)fTime; } // [ms] Time of Day returned in the range [-11h, 13h)
131 void GetTime(Byte_t &h, Byte_t &m, Byte_t &s, UShort_t &ms) const;
132 void GetTime(Byte_t &h, Byte_t &m, Byte_t &s) const
133 {
134 UShort_t ms;
135 GetTime(h, m, s, ms);
136 }
137
138 UInt_t Year() const { UShort_t y; Byte_t m, d; GetDate(y,m,d); return y; }
139 UInt_t Month() const { UShort_t y; Byte_t m, d; GetDate(y,m,d); return m; }
140 UInt_t Day() const { UShort_t y; Byte_t m, d; GetDate(y,m,d); return d; }
141 Byte_t WeekDay() const; // { return TMath::FloorNint(GetMjd()+3)%7; } // Return Day of the week: Sun=0, Mon=1, ..., Sat=6
142 UInt_t Hour() const { Byte_t h, m, s; GetTime(h,m,s); return h; }
143 UInt_t Min() const { Byte_t h, m, s; GetTime(h,m,s); return m; }
144 UInt_t Sec() const { Byte_t h, m, s; GetTime(h,m,s); return s; }
145 UInt_t MilliSec() const { return (GetTime()+kDay)%1000; }
146 UInt_t MicroSec() const { return fNanoSec/1000+MilliSec()*1000; }
147 UInt_t NanoSec() const { return fNanoSec+MilliSec()*1000000; }
148 Int_t Week() const { Short_t y; return Week(y); }
149 Int_t Week(Short_t &year) const;
150 UInt_t DayOfYear() const;
151
152 Bool_t IsMidnight() const { return (Long_t)fTime==0 && fNanoSec==0; }
153 Bool_t IsLeapYear() const;
154
155 // I/O functions
156 istream &ReadBinary(istream &fin);
157 ostream &WriteBinary(ostream &out) const;
158
159 void AsciiRead(istream &fin);
160 Bool_t AsciiWrite(ostream &out) const;
161
162 // Conversion functions
163 operator double() const; //[s]
164 double operator()() const; //[s]
165
166 Double_t AsDouble() const { return GetMjd(); }
167 //const char *AsString() const { return GetString(); }
168 //const char *AsSQLString() const { return GetSqldateTime(); }
169
170 // Calculation functions
171 void AddMilliSeconds(UInt_t ms);
172 void Minus1ns();
173 void Plus1ns();
174 void SetMean(const MTime &t0, const MTime &t1);
175 void SetMean(Double_t t0, Double_t t1);
176 /*
177 MTime operator-(const MTime &tm1);
178 void operator-=(const MTime &t);
179 MTime operator+(const MTime &t1);
180 void operator+=(const MTime &t);
181 */
182
183 // Base comparison operators
184 bool operator<(const MTime &t) const;
185 bool operator>(const MTime &t) const;
186
187 // Derived comparison operators
188 bool operator<=(const MTime &t) const;
189 bool operator>=(const MTime &t) const;
190 bool operator==(const MTime &t) const;
191 bool operator!=(const MTime &t) const;
192 bool operator!() const;
193
194 static MTime GetEaster(Short_t year=-1);
195 static Int_t GetMjdWeek1(Short_t year);
196
197 ClassDef(MTime, 3) //A generalized MARS time stamp
198};
199
200inline ostream &operator<<(ostream &out, const MTime &t)
201{
202 out << t.GetString();
203 return out;
204}
205
206inline istream &operator>>(istream &in, MTime &t)
207{
208 TString date, time;
209 date.ReadToDelim(in, ' ');
210 time.ReadToDelim(in, ' ');
211 t.SetString(Form("%s %s", date.Data(), time.Data()));
212 return in;
213}
214
215inline MTime::operator double() const //[s]
216{
217 return ((Double_t)fMjd*kDay+(Long_t)fTime+fNanoSec/1e6)/1000;
218}
219
220inline double MTime::operator()() const //[s]
221{
222 return operator double();
223}
224
225inline bool MTime::operator<(const MTime &t) const
226{
227 if (fMjd<t.fMjd)
228 return true;
229 if (fMjd==t.fMjd && fTime<t.fTime)
230 return true;
231 if (fMjd==t.fMjd && fTime==t.fTime && fNanoSec<t.fNanoSec)
232 return true;
233 return false;
234}
235
236inline bool MTime::operator>(const MTime &t) const
237{
238 if (fMjd>t.fMjd)
239 return true;
240 if (fMjd==t.fMjd && fTime>t.fTime)
241 return true;
242 if (fMjd==t.fMjd && fTime==t.fTime && fNanoSec>t.fNanoSec)
243 return true;
244 return false;
245}
246
247inline bool MTime::operator<=(const MTime &t) const
248{
249 return !operator>(t);
250}
251
252inline bool MTime::operator>=(const MTime &t) const
253{
254 return !operator<(t);
255}
256
257inline bool MTime::operator==(const MTime &t) const
258{
259 return fNanoSec==t.fNanoSec && fTime==t.fTime && fMjd==t.fMjd;
260}
261
262inline bool MTime::operator!=(const MTime &t) const
263{
264 return fNanoSec!=t.fNanoSec || fTime!=t.fTime || fMjd!=t.fMjd;
265}
266
267inline bool MTime::operator!() const
268{
269 return fNanoSec==0 && (ULong_t)fTime==0 && fMjd==0;
270}
271
272#endif
Note: See TracBrowser for help on using the repository browser.