Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
time.cc
Go to the documentation of this file.
1 #include "time.hh"
2 #include "TMath.h"
3 
4 #define CWB_MJD_REF 2400000.5 // Reference Julian Day for Mean Julian Day
5 
6 ClassImp(wat::Time) // used by THtml doc
7 
8 using namespace wat;
9 
10 /* :TODO: this Time class is used in many place where seconds are INT_4U.
11  Perhaps I should rename this class OffsetTime and write another called Time,
12  where seconds are unsigned */
13 
14 //-----------------------------------------------------------------------------
15 // Constructors
16 //-----------------------------------------------------------------------------
17 
18 
19 //-----------------------------------------------------------------------------
20 //
21 // Constructor.
22 //
23 // param: INT_4S sec - number of seconds. Default: 0
24 // param: INT_4U nsec - number of nanoseconds. Default: 0
25 
26 wat::Time::Time(INT_4S sec, INT_4U nsec) : mSec(sec), mNSec(nsec) {
27 
28  tzset();
29  setenv("TZ", ":UTC", 1);
30 
31  if ( mNSec >= 1000000000 ) {
32  mSec += INT_4S( mNSec / 1000000000 );
33  mNSec = mNSec % 1000000000;
34  }
35 }
36 
37 //: uct from Double conversion AC
38 wat::Time::Time(double dtime) : mSec(0), mNSec(0) {
39 
40  tzset();
41  setenv("TZ", ":UTC", 1);
42 
43  SetDouble(dtime);
44 }
45 
46 //-----------------------------------------------------------------------------
47 // Copy Constructor.
48 // param: Time& time -
49 
50 wat::Time::Time(Time& time) : mSec(time.GetSec()), mNSec(time.GetNSec()) {
51  tzset();
52  setenv("TZ", ":UTC", 1);
53 }
54 
55 //-----------------------------------------------------------------------------
56 // Operator Overloads
57 //-----------------------------------------------------------------------------
58 
59 //-----------------------------------------------------------------------------
60 // Assignment Operator.
61 // param: Time& time -
62 // return: Time&
63 // exc: bad_alloc - Memory allocation failed.
64 
66 
67  if ( this != &time ) {
68  mSec = time.GetSec();
69  mNSec = time.GetNSec();
70  }
71  return *this;
72 }
73 
74 
75 //-----------------------------------------------------------------------------
76 // Addition & assignment.
77 // param: Time& time -
78 // return: Time& time -
79 
81 
82  mSec += time.GetSec();
83  mNSec += time.GetNSec();
84  if ( mNSec >= 1000000000 ) {
85  mSec += INT_4S( mNSec / 1000000000 );
86  mNSec = mNSec % 1000000000;
87  }
88  return *this;
89 }
90 
91 
92 //-----------------------------------------------------------------------------
93 // Subtraction and assignment.
94 // param: Time& time -
95 // return: Time& time -
96 
98 
99  mSec -= time.GetSec();
100  if ( mNSec >= time.GetNSec() ) {
101  mNSec -= time.GetNSec();
102  } else {
103  --mSec;
104  mNSec += 1000000000 - time.GetNSec();
105  }
106  return *this;
107 }
108 
109 //-----------------------------------------------------------------------------
110 // Multiplication and assignment.
111 // param: double& d -
112 // return: Time& time -
113 // todo: What happens if d is negative?
114 
116 
117  unsigned long long tmp = d*1000000000;
118  unsigned long long lsec1 = d;
119  unsigned long long lnsec1 = (tmp%1000000000)/100;
120  unsigned long long lsec2 = mSec;
121  unsigned long long lnsec2 = mNSec/100;
122 
123  tmp = lsec1*lsec2*1000000000+(lsec1*lnsec2+lnsec1*lsec2)*100+(lnsec1*lnsec2)/100000;
124 
125  mSec = tmp/1000000000;
126  mNSec = tmp%1000000000;
127 
128  return *this;
129 }
130 
131 //-----------------------------------------------------------------------------
132 // Division and assignment.
133 // param: double& d -
134 // return: Time& time -
135 // todo: What happens if d is negative?
136 
138 
139  double ns = mNSec / d;
140  double s = mSec / d;
141  mSec = INT_4S( mSec / d );
142  mNSec = (INT_4U)( ns+(s-mSec)*1000000000 );
143  return *this;
144 }
145 
146 //-----------------------------------------------------------------------------
147 // Division.
148 // param: Time& time -
149 // return: double -
150 
152 
153  return ((1000000000*mSec+mNSec)
154  /(1000000000*time.GetSec()+time.GetNSec()));
155 }
156 
157 //-----------------------------------------------------------------------------
158 // Equal comparison.
159 // Determines whether two Time objects are equal.
160 // param: Time& time - The object to compare with.
161 // return: bool - true if the objects are equal.
162 
164  return (mSec==time.GetSec())&&(mNSec==time.GetNSec());
165 }
166 
167 //-----------------------------------------------------------------------------
168 // Less than or equal to comparison.
169 // param: Time& time - The object to compare with.
170 // return: bool -
171 
173  return !( *this > time );
174 }
175 
176 //-----------------------------------------------------------------------------
177 // Greater than or equal to comparison.
178 // param: Time& time - The object to compare with.
179 // return: bool -
180 
182  return !( *this < time );
183 }
184 
185 //-----------------------------------------------------------------------------
186 // Not equal comparison.
187 // param: Time& time - The object to compare with.
188 // return: bool -
189 
191  return !( *this == time );
192 }
193 
194 //-----------------------------------------------------------------------------
195 // Less than comparison.
196 // param: Time& time - The object to compare with.
197 // return: bool -
198 
200 
201  if ( mSec != time.GetSec() ) {
202  return ( mSec < time.GetSec() );
203  } else {
204  return ( mNSec < time.GetNSec() );
205  }
206 }
207 
208 //-----------------------------------------------------------------------------
209 // Greater than comparison.
210 // param: Time& time - The object to compare with.
211 // return: bool -
212 
214 
215  if (mSec != time.GetSec()) {
216  return ( mSec > time.GetSec() );
217  } else {
218  return ( mNSec > time.GetNSec() );
219  }
220 }
221 
222 //-----------------------------------------------------------------------------
223 // Addition.
224 // param: Time& t1
225 // param: Time& t2
226 // return: Time -
227 
229 
230  Time t3( t1 );
231  return ( t3 += t2 );
232 }
233 
234 //-----------------------------------------------------------------------------
235 // Subtraction.
236 // param: Time& t1
237 // param: Time& t2
238 // return: Time -
239 
241  Time t3( t1 );
242  return ( t3 -= t2 );
243 }
244 
245 //-----------------------------------------------------------------------------
246 // Multiplication.
247 // param: Time& t
248 // param: double& d
249 // return: Time -
250 
251 Time wat::operator*(Time& t, double& d) {
252  Time t3( t );
253  return ( t3 *= d );
254 }
255 
256 //-----------------------------------------------------------------------------
257 // Division.
258 // param: Time& t
259 // param: double& d
260 // return: Time -
261 
262 Time wat::operator/(Time& t, double& d) {
263  Time t3( t );
264  return ( t3 /= d );
265 }
266 
267 //-----------------------------------------------------------------------------
268 // Multiplication.
269 // param: double& d
270 // param: Time& t
271 // return: Time -
272 
273 Time wat::operator*(double& d, Time& t) {
274  Time t3( t );
275  return ( t3 *= d );
276 }
277 
278 //-----------------------------------------------------------------------------
279 // Input extraction operator.
280 // param: Input& in
281 // param: Time& time
282 // return: Input&
283 // exc: read_failure
284 
285 istream& wat::operator>>(istream& in, Time& time) {
286  in >> time.mSec >> time.mNSec;
287  return in;
288 }
289 
290 //-----------------------------------------------------------------------------
291 // Double conversion operators (AC)
292 
293 void wat::Time::SetDouble(double dt) {
294 
295  mSec = dt;
296  unsigned long long tmp = dt*1000000000;
297  mNSec = (tmp%1000000000);
298 }
299 
300 //-----------------------------------------------------------------------------
301 
303 
304  double dt;
305  dt = mSec + 1.e-9 * mNSec;
306  return dt;
307 }
308 
309 //-----------------------------------------------------------------------------
310 // Set Date String
311 // Date Format : XXYY-MM-DD hh:mm:ss
312 
314 
315  date.ToLower();
316 
317  if (date.CompareTo("now")==0) { // set current date
318  time_t ticks = time(NULL);
319  this->SetSec(mktime(gmtime(&ticks)));
320  this->SetNSec(0);
321  this->UnixToGps();
322  return;
323  }
324 
325  date.Resize(19);
326 
327  // if date string is compatible with a integer it is converted to date
328  if (date.IsDigit()) {this->SetSec(date.Atoi());return;}
329 
330  TString idate;
331  if (date.Sizeof()==20) { // "XXYY-MM-DD hh:mm:ss" -> "ss:mm:hh-DD:MM:YY"
332  int xx = TString(date(0,2)).Atoi();
333  int yy = TString(date(2,2)).Atoi();
334  if (yy>=80) if(xx!=19) {
335  char msg[256];
336  sprintf(msg,"error in data format : %s [Year >= 1980 && <2079]",date.Data());
337  Error(msg);
338  }
339  if (yy<80) if(xx!=20) {
340  char msg[256];
341  sprintf(msg,"error in data format : %s [Year >= 1980 && <2079]",date.Data());
342  Error(msg);
343  }
344  idate = date(17,2)+":"+date(14,2)+":"+date(11,2)+"-"+date(8,2)+":"+date(5,2)+":"+date(2,2);
345  } else {
346  idate = date;
347  }
348  SetString(const_cast<char*>(idate.Data()));
349 }
350 
351 //-----------------------------------------------------------------------------
352 // Set Date String
353 // Date Format : ss:mm:hh:DD:MM:YY
354 
355 void wat::Time::SetString(char* date, int nsec) {
356 
357  char DD_s[4],MM_s[4],YY_s[4],hh_s[4],mm_s[4],ss_s[4];
358  int DD,MM,YY,hh,mm,ss;
359 
360  if (strlen(date) != 17) Error(const_cast<char*>("date length not valid"));
361 
362  strncpy(ss_s,date,2);
363  if(!isdigit(ss_s[0])) Error(const_cast<char*>("sec not valid format"));
364  if(!isdigit(ss_s[1])) Error(const_cast<char*>("sec not valid format"));
365  ss_s[2]=0;
366  ss=atoi(ss_s);
367 
368  strncpy(mm_s,date+3,2);
369  if(!isdigit(mm_s[0])) Error(const_cast<char*>("minutes not valid format"));
370  if(!isdigit(mm_s[1])) Error(const_cast<char*>("minutes not valid format"));
371  mm_s[2]=0;
372  mm=atoi(mm_s);
373 
374  strncpy(hh_s,date+6,2);
375  if(!isdigit(hh_s[0])) Error(const_cast<char*>("hour not valid format"));
376  if(!isdigit(hh_s[1])) Error(const_cast<char*>("hour not valid format"));
377  hh_s[2]=0;
378  hh=atoi(hh_s);
379 
380  strncpy(DD_s,date+9,2);
381  if(!isdigit(DD_s[0])) Error(const_cast<char*>("day not valid format"));
382  if(!isdigit(DD_s[1])) Error(const_cast<char*>("day not valid format"));
383  DD_s[2]=0;
384  DD=atoi(DD_s);
385 
386  strncpy(MM_s,date+12,2);
387  if(!isdigit(MM_s[0])) Error(const_cast<char*>("month not valid format"));
388  if(!isdigit(MM_s[1])) Error(const_cast<char*>("month not valid format"));
389  MM_s[2]=0;
390  MM=atoi(MM_s);
391 
392  strncpy(YY_s,date+15,2);
393  if(!isdigit(YY_s[0])) Error(const_cast<char*>("year not valid format"));
394  if(!isdigit(YY_s[1])) Error(const_cast<char*>("year not valid format"));
395  YY_s[2]=0;
396  YY=atoi(YY_s);
397  if (YY<70) YY+=100;
398 
399  SetDate(ss,mm,hh,DD,MM,YY,nsec);
400 }
401 
402 void wat::Time::SetDate(int ss, int mm, int hh, int DD, int MM, int YY, int nsec) {
403 
404  // the values must be checked !!!!!!!!! -> to be done
405 
406  if(YY>1900) YY-=1900;
407 
408  // extern char *tzname[2];
409  struct tm in_tp;
410 
411  in_tp.tm_sec = ss; // seconds 0:59
412  in_tp.tm_min = mm; // minutes 0:59
413  in_tp.tm_hour = hh; // hours 0:23
414  in_tp.tm_mday = DD; // day of the month 1:31
415  in_tp.tm_mon = MM-1; // month 0:11
416  in_tp.tm_year = YY; // year since 1900
417  in_tp.tm_isdst= 0;
418 
419  tzset();
420  setenv("TZ", ":UTC", 1);
421 
422  time_t in_utc_sec = mktime(&in_tp);
423  struct tm* out_tp = gmtime(&in_utc_sec);
424  time_t out_utc_sec = mktime(out_tp);
425 
426  // setenv("TZ", *tzname, 1);
427 
428  if (in_tp.tm_sec != ss) Error(const_cast<char*>("sec not valid format"));
429  if (in_tp.tm_min != mm) Error(const_cast<char*>("minutes not valid format"));
430  if (in_tp.tm_hour != hh) Error(const_cast<char*>("hour not valid format"));
431  if (in_tp.tm_mday != DD) Error(const_cast<char*>("day not valid format"));
432  if (in_tp.tm_mon != MM-1) Error(const_cast<char*>("month not valid format"));
433  if (in_tp.tm_year != YY) Error(const_cast<char*>("year not valid format"));
434 
435  if(in_utc_sec != out_utc_sec) Error(const_cast<char*>("Date not valid format"));
436 
437  mSec = in_utc_sec; // - UTC_UNIX_SPAN - UTC_LEAP_SECONDS;
438  mNSec = nsec;
439 
440  UnixToGps();
441 };
442 
444 
445  Time tempTime(*this);
446  tempTime.GpsToUnix();
447  time_t time = tempTime.GetSec();
448 
449  bool leap=false;
450  for(int i=0;i<GPS_LEAPS_TABLE_SIZE;i++)
451  if(gps_leaps_table[i].gps==GetSec()+1) {time-=1;leap=true;break;}
452 
453  // Convert Data Format
454  // From
455  // Thu Feb 5 05:30:34 1981
456  // To
457  // 1981-02-05 05:30:34 UTC Thu
458 
459  TObjArray* token = TString(ctime(&time)).Tokenize(TString(' '));
460  TObjString* week_tok = (TObjString*)token->At(0);
461  TString week = week_tok->GetString();
462  TObjString* month_tok = (TObjString*)token->At(1);
463  TString month = month_tok->GetString();
464  TObjString* day_tok = (TObjString*)token->At(2);
465  TString day = day_tok->GetString();
466  TObjString* hhmmss_tok = (TObjString*)token->At(3);
467  TString hhmmss = hhmmss_tok->GetString();
468  if(leap) {hhmmss[6]='6';hhmmss[7]='0';}
469  TObjString* year_tok = (TObjString*)token->At(4);
470  TString year = year_tok->GetString();
471  year.Resize(year.Sizeof()-2);
472 
473  if(month.CompareTo("Jan")==0) month="01";
474  if(month.CompareTo("Feb")==0) month="02";
475  if(month.CompareTo("Mar")==0) month="03";
476  if(month.CompareTo("Apr")==0) month="04";
477  if(month.CompareTo("May")==0) month="05";
478  if(month.CompareTo("Jun")==0) month="06";
479  if(month.CompareTo("Jul")==0) month="07";
480  if(month.CompareTo("Aug")==0) month="08";
481  if(month.CompareTo("Sep")==0) month="09";
482  if(month.CompareTo("Oct")==0) month="10";
483  if(month.CompareTo("Nov")==0) month="11";
484  if(month.CompareTo("Dec")==0) month="12";
485 
486  char date[256];
487  // 1981-02-05 05:30:34 UTC Thu
488  sprintf(date,"%s-%s-%02d %s UTC %s",year.Data(),month.Data(),day.Atoi(),hhmmss.Data(),week.Data());
489 
490  return date;
491 }
492 
494 /*
495  char time_str[26];
496  Time tempTime(*this);
497  tempTime.GpsToUnix();
498  time_t time = tempTime.GetSec();
499  strcpy(time_str, ctime(&time));
500  cout << time_str << endl;
501 */
502  cout << GetDateString().Data() << endl;
503 }
504 
506 //
507 // From LAL XLALCivilTime.c
508 //
509 // Returns the Julian Date (JD)
510 //
511 // See ref esaa1992 and ref green1985 for details. First, some
512 // definitions:
513 //
514 // Mean Julian Year = 365.25 days
515 // Julian Epoch = 1 Jan 4713BCE, 12:00 GMT (4713 BC Jan 01d.5 GMT)
516 // Fundamental Epoch J2000.0 = 2001-01-01.5 TDB
517 //
518 // Julian Date is the amount of time elapsed since the Julian Epoch,
519 // measured in days and fractions of a day. There are a couple of
520 // complications arising from the length of a year: the Tropical Year is
521 // 365.2422 days. First, the Gregorian correction where 10 days
522 // (1582-10-05 through 1582-10-14) were eliminated. Second, leap years:
523 // years ending with two zeroes (e.g., 1700, 1800) are leap only if
524 // divisible by 400; so, 400 civil years contain 400 * 365.25 - 3 = 146097
525 // days. So, the Julian Date of J2000.0 is JD 2451545.0, and thus the
526 // Julian Epoch = J2000.0 + (JD - 2451545) / 365.25, i.e., number of years
527 // elapsed since J2000.0.
528 //
529 // One algorithm for computing the Julian Day is from ref vfp1979 based
530 // on a formula in ref esaa1992 where the algorithm is due to
531 // fvf1968 and ``compactified'' by P. M. Muller and R. N. Wimberly.
532 // The formula is
533 //
534 // \f[
535 // jd = 367 \times y - 7 \times (y + (m + 9)/12)/4 - 3 \times ((y + (m -
536 // 9)/7)/100 + 1)/4 + 275 \times m/9 + d + 1721029
537 // \f]
538 //
539 // where jd is the Julian day number, y is the year, m is the month (1-12),
540 // and d is the day (1-31). This formula is valid only for JD > 0, i.e.,
541 // after -4713 Nov 23 = 4712 BCE Nov 23.
542 //
543 // A shorter formula from the same reference, but which only works for
544 // dates since 1900 March is:
545 //
546 // \f[
547 // jd = 367 \times y - 7 \times (y + (m + 9)/12)/4 + 275 \times m/9 + d +
548 // 1721014
549 // \f]
550 //
551 // We will use this shorter formula since there is unlikely to be any
552 // analyzable data from before 1900 March.
553 //
554 
555  const int sec_per_day = 60 * 60 * 24; // seconds in a day
556  int year, month, day, sec;
557  double jd;
558 
559  // this routine only works for dates after 1900
560  if(GetYear()<=0) Error(const_cast<char*>("Year must be after 1900"));
561 
562  year = GetYear();
563  month = GetMonth(); // month is in range 1-12
564  day = GetDay(); // day is in range 1-31
565  sec = GetSecond() + 60*(GetMinute() + 60*GetHour()); // seconds since midnight
566 
567  jd = 367*year - 7*(year + (month + 9)/12)/4 + 275*month/9 + day + 1721014;
568  // note: Julian days start at noon: subtract half a day
569  jd += (double)sec/(double)sec_per_day - 0.5;
570  return jd;
571 }
572 
574 //
575 // From LAL XLALCivilTime.c
576 //
577 // Returns the Modified Julian Day (MJD)
578 //
579 // Note:
580 // - By convention, MJD is an integer.
581 // - MJD number starts at midnight rather than noon.
582 //
583 // If you want a Modified Julian Day that has a fractional part, simply use
584 //
585 
586  double jd = GetJulianDate();
587  if(TMath::IsNaN(jd)) Error(const_cast<char*>("julian day is a NaN"));
588  double mjd = jd - CWB_MJD_REF;
589  return mjd;
590 }
591 
593 
594  int i = 1;
595  while (gps >= gps_leaps_table[i].gps) {++i;if(i>=GPS_LEAPS_TABLE_SIZE) break;}
596  return gps_leaps_table[i-1].gps_utc;
597 }
598 
599 int wat::Time::UnixToGpsLeaps(int unix_time) {
600 
601  int i = 1;
602  while (unix_time >= (gps_leaps_table[i].gps + UTC_UNIX_SPAN - GpsToGpsLeaps(gps_leaps_table[i].gps)))
603  {++i;if(i>=GPS_LEAPS_TABLE_SIZE) break;}
604  return gps_leaps_table[i-1].gps_utc;
605 }
606 
607 //-----------------------------------------------------------------------------
608 // Output insertion operator.
609 // param: Output& out
610 // param: Time& time
611 // return: Output&
612 // exc: write_failure
613 
614 ostream& wat::operator<<(ostream& out, Time& time) {
615 
616  out << time.GetSec() << ":";
617  out.fill('0');
618  out.width(9);
619  out << time.GetNSec();
620  out << endl;
621  return out;
622 }
623 
624 //-----------------------------------------------------------------------------
625 // Get the number of seconds.
626 // return: INT_4S
627 
629  return mSec;
630 }
631 
632 //-----------------------------------------------------------------------------
633 // Get the number of nanoseconds.
634 // return: INT_4U
635 
637  return mNSec;
638 }
wavearray< double > t(hp.size())
#define CWB_MJD_REF
Definition: time.cc:4
int GpsToGpsLeaps(int gpsSec)
INT_4S mSec
Definition: time.hh:233
Time & operator=(Time &time)
Definition: time.cc:65
TString GetDateString()
Definition: time.cc:443
cout<< "skymap size : "<< L<< endl;for(int l=0;l< L;l++) sm.set(l, l);sm > const_cast< char * >("skymap.dat")
TString("c")
INT_4U GetNSec()
Definition: time.cc:636
void SetDate(int ss, int mm, int hh, int DD, int MM, int YY, int nsec=0)
Definition: time.cc:402
bool operator!=(Time &time)
Definition: time.cc:190
void SetDateString(TString date)
Definition: time.cc:313
Time operator-(Time &t1, Time &t2)
Definition: time.cc:240
void SetString(char *date, int nsec=0)
Definition: time.cc:355
Time operator+(Time &t1, Time &t2)
Definition: time.cc:228
i drho i
Time operator*(Time &t, double &d)
Definition: time.cc:251
Definition: alm.hh:20
cout<< "Selected Pixels : "<< nPix<< endl;wc.cluster(1, 1);SSeries< double > ss
int gps_utc
Definition: time.hh:28
istream & operator>>(istream &in, Time &time)
Definition: time.cc:285
ofstream out
Definition: cwb_merge.C:196
double operator/(Time &time)
Definition: time.cc:151
double time[6]
Definition: cbc_plots.C:435
wavearray< double > xx
Definition: TestFrame1.C:11
#define GPS_LEAPS_TABLE_SIZE
Definition: time.hh:22
#define INT_4U
Definition: time.hh:17
ostream & operator<<(ostream &out, Time &time)
Definition: time.cc:614
void SetDouble(double dt)
Definition: time.cc:293
double * tmp
Definition: testWDM_5.C:31
bool operator==(Time &time)
Definition: time.cc:163
TObjArray * token
double GetJulianDate()
Definition: time.cc:505
static const gps_leap gps_leaps_table[GPS_LEAPS_TABLE_SIZE]
Definition: time.hh:34
INT_4U mNSec
Definition: time.hh:234
bool operator<=(Time &time)
Definition: time.cc:172
wavearray< double > yy
Definition: TestFrame5.C:12
Time operator/(Time &t, double &d)
Definition: time.cc:262
double dt
s s
Definition: cwb_net.C:137
int UnixToGpsLeaps()
Definition: time.hh:203
double gps
ifstream in
Time & operator*=(double &d)
Definition: time.cc:115
Time(INT_4S sec=0, INT_4U nsec=0)
Definition: time.cc:26
double GetModJulianDate()
Definition: time.cc:573
Time & operator-=(Time &time)
Definition: time.cc:97
sprintf(tfres,"(1/%g)x(%g) (sec)x(Hz)", 2 *df, df)
Time & operator+=(Time &time)
Definition: time.cc:80
INT_4S GetSec()
Definition: time.cc:628
#define INT_4S
Definition: time.hh:16
TH1 * t1
double GetDouble()
Definition: time.cc:302
void Print()
Definition: time.cc:493
#define UTC_UNIX_SPAN
Definition: time.hh:19
double ctime
void GpsToUnix()
Definition: time.hh:219
bool operator<(Time &time)
Definition: time.cc:199
Time & operator/=(double &d)
Definition: time.cc:137
int GpsToGpsLeaps()
Definition: time.hh:202
bool operator>=(Time &time)
Definition: time.cc:181
bool operator>(Time &time)
Definition: time.cc:213