ROOT logo
// @(#)root/base:$Id$
// Author: Rene Brun   05/01/95

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TDatime                                                              //
//                                                                      //
// This class stores the date and time with a precision of one second   //
// in an unsigned 32 bit word (e.g. 950130 124559). The date is stored  //
// with the origin being the 1st january 1995.                          //
//                                                                      //
// This class has no support for time zones. The time is assumed        //
// to be in the local time of the machine where the object was created. //
// As a result, TDatime objects are not portable between machines       //
// operating in different time zones and unsuitable for storing the     //
// date/time of data taking events and the like. If absolute time is    //
// required, use TTimeStamp.                                            //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "RConfig.h"

#include <time.h>

#ifdef WIN32
#include "Windows4Root.h"
#include <string.h>
#endif

#include "TBuffer.h"
#include "Strlen.h"
#include "TDatime.h"
#include "TError.h"
#include "Bytes.h"
#include "TString.h"


ClassImp(TDatime)

//______________________________________________________________________________
TDatime::TDatime()
{
   // Create a TDatime and set it to the current time.

   Set();
}

//______________________________________________________________________________
TDatime::TDatime(Int_t date, Int_t time)
{
   // Create a TDatime and set it to the specified date and time.
   // See Set(Int_t, Int_t) about the date, time format.

   Set(date, time);
}

//______________________________________________________________________________
TDatime::TDatime(Int_t year, Int_t month, Int_t day,
                 Int_t hour, Int_t min, Int_t sec)
{
   // Create a TDatime and set it to the specified year, month,
   // day, time, hour, minute and second. See Set() about the format.

   Set(year, month, day, hour, min, sec);
}

//______________________________________________________________________________
TDatime::TDatime(const char *sqlDateTime)
{
   // Expects as input a string in SQL date/time compatible format, like:
   // yyyy-mm-dd hh:mm:ss.

   Set(sqlDateTime);
}

//______________________________________________________________________________
Int_t TDatime::GetDayOfWeek() const
{
   // Returns day of week, with Monday being day 1 and Sunday day 7.

   static TString weekDays[7] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
   TString wd = AsString();
   int  day;
   for (day = 0; day < 7; day++) {
      if (wd(0, 3) == weekDays[day])
         break;
   }
   return (day < 7) ? day+1: -1;
}

//______________________________________________________________________________
const char *TDatime::AsString() const
{
   // Return the date & time as a string (ctime() format).
   // Copy result because it points to a statically allocated string.

   time_t t = Convert();
   char *retStr = ctime(&t);
   if (retStr) {
      *(retStr + 24) = 0;
      return retStr;
   } else {
      static const char *defaulttime = "15/06/96";
      Error("TDatime::AsString", "could not get time string");
      return defaulttime;
   }
}

//______________________________________________________________________________
const char *TDatime::AsString(char *out) const
{
   // Return the date & time as a string (ctime() format).
   // Result is copied into out (and out is returned). Make sure
   // out can at least contain 26 characters. Thread safe.

   time_t t = Convert();
#ifdef _REENTRANT
#if defined(R__SOLARIS) && (_POSIX_C_SOURCE - 0 < 199506L)
   char *retStr = ctime_r(&t, out, 26);
#else
   char *retStr = ctime_r(&t, out);
#endif
#else
   char *retStr = ctime(&t);
#endif
   if (retStr) {
      *(retStr + 24) = 0;
#ifndef _REENTRANT
      strcpy(out, retStr);
#endif
      return retStr;
   } else {
      static const char *defaulttime = "15/06/96";
      strcpy(out, defaulttime);
      Error("TDatime::AsString", "could not get time string");
      return defaulttime;
   }
}

//______________________________________________________________________________
const char *TDatime::AsSQLString() const
{
   // Return the date & time in SQL compatible string format, like:
   // 1997-01-15 20:16:28. The returned string buffer is static and
   // will be reused.

   static char sqldate[20];

   UInt_t year  = fDatime>>26;
   UInt_t month = (fDatime<<6)>>28;
   UInt_t day   = (fDatime<<10)>>27;
   UInt_t hour  = (fDatime<<15)>>27;
   UInt_t min   = (fDatime<<20)>>26;
   UInt_t sec   = (fDatime<<26)>>26;

   snprintf(sqldate,20, "%04d-%02d-%02d %02d:%02d:%02d", (year+1995), month, day,
           hour, min, sec);

   return sqldate;
}

//______________________________________________________________________________
UInt_t TDatime::Convert(Bool_t toGMT) const
{
   // Convert fDatime from TDatime format to the standard time_t format.
   // If toGMT is true, the time offset of the current local time zone is
   // subtracted from the returned time_t. One use of such a non-standard time_t
   // value is to convert a TDatime object that contains local time to GMT,
   // as in this example:
   //
   // TDatime now;
   // now.Set(now.Convert(kTRUE));
   //
   // Caution: the time_t returned from Convert(kTRUE) is incompatible with
   // regular Unix time - it contains an artificial, locale-dependent offset.

   UInt_t year  = fDatime>>26;
   UInt_t month = (fDatime<<6)>>28;
   UInt_t day   = (fDatime<<10)>>27;
   UInt_t hour  = (fDatime<<15)>>27;
   UInt_t min   = (fDatime<<20)>>26;
   UInt_t sec   = (fDatime<<26)>>26;

   struct tm tp;
   tp.tm_year  = year+95;
   tp.tm_mon   = month-1;
   tp.tm_mday  = day;
   tp.tm_hour  = hour;
   tp.tm_min   = min;
   tp.tm_sec   = sec;
   tp.tm_isdst = -1;

   time_t t = mktime(&tp);
   if ((int)t == -1) {
      Error("TDatime::Convert", "error converting fDatime to time_t");
      return 0;
   }
   if (toGMT) {
#ifdef _REENTRANT
      struct tm tg;
      struct tm *tgp = gmtime_r(&t, &tg);
#else
      struct tm *tgp = gmtime(&t);
#endif
      tgp->tm_isdst = -1;
      t  = mktime(tgp);
   }
   return (UInt_t)t;
}

//______________________________________________________________________________
void TDatime::Copy(TDatime &datime) const
{
   // Copy this to datime.

   datime.fDatime = fDatime;
}

//______________________________________________________________________________
void TDatime::FillBuffer(char *&buffer)
{
   // Encode Date/Time into buffer, used by I/O system.

   tobuf(buffer, fDatime);
}

//______________________________________________________________________________
UInt_t TDatime::Get() const
{
   // Return raw date/time as encoded by TDatime. Note, this value cannot
   // be used to e.g. calculate time differences, as it is an encoded value.
   // To calculate time differences use the Convert() method to get a time
   // in seconds and then subtract the values.

   return fDatime;
}

//______________________________________________________________________________
Int_t TDatime::GetDate() const
{
   // Return date in form of 19971224 (i.e. 24/12/1997)

   UInt_t year  = fDatime>>26;
   UInt_t month = (fDatime<<6)>>28;
   UInt_t day   = (fDatime<<10)>>27;
   return 10000*(year+1995) + 100*month + day;
}

//______________________________________________________________________________
Int_t TDatime::GetTime() const
{
   // Return time in form of 123623 (i.e. 12:36:23)

   UInt_t hour  = (fDatime<<15)>>27;
   UInt_t min   = (fDatime<<20)>>26;
   UInt_t sec   = (fDatime<<26)>>26;
   return 10000*hour + 100*min + sec;
}

//______________________________________________________________________________
void TDatime::Print(Option_t *) const
{
   // Print date and time.

   printf("Date/Time = %s\n", AsString());
}

//______________________________________________________________________________
void TDatime::ReadBuffer(char *&buffer)
{
   // Decode Date/Time from output buffer, used by I/O system.

   frombuf(buffer, &fDatime);
}

//______________________________________________________________________________
void TDatime::Set()
{
   // Set Date/Time to current time as reported by the system.
   // Date and Time are encoded into one single unsigned 32 bit word.
   // Date is stored with the origin being the 1st january 1995.
   // Time has 1 second precision.

#ifndef WIN32
   time_t tloc   = time(0);
#ifdef _REENTRANT
   struct tm tpa;
   struct tm *tp = localtime_r(&tloc, &tpa);
#else
   struct tm *tp = localtime(&tloc);
#endif
   UInt_t year   = tp->tm_year;
   UInt_t month  = tp->tm_mon + 1;
   UInt_t day    = tp->tm_mday;
   UInt_t hour   = tp->tm_hour;
   UInt_t min    = tp->tm_min;
   UInt_t sec    = tp->tm_sec;
#else
   SYSTEMTIME tp;
   GetLocalTime(&tp);
   UInt_t year   = tp.wYear-1900;
   UInt_t month  = tp.wMonth;
   UInt_t day    = tp.wDay;
   UInt_t hour   = tp.wHour;
   UInt_t min    = tp.wMinute;
   UInt_t sec    = tp.wSecond;
#endif

   fDatime = (year-95)<<26 | month<<22 | day<<17 | hour<<12 | min<<6 | sec;
}

//______________________________________________________________________________
void TDatime::Set(UInt_t tloc, Bool_t dosDate)
{
   // The input arg is a time_t value returned by time() or a value
   // returned by Convert(). This value is the number of seconds since
   // the EPOCH (i.e. 00:00:00 on Jan 1m 1970). If dosDate is true then
   // the input is a dosDate value.

   UInt_t year, month, day, hour, min, sec;

   if (dosDate) {
      year  = ((tloc >> 25) & 0x7f) + 80;
      month = ((tloc >> 21) & 0xf);
      day   = (tloc >> 16) & 0x1f;
      hour  = (tloc >> 11) & 0x1f;
      min   = (tloc >> 5) & 0x3f;
      sec   = (tloc & 0x1f) * 2;
   } else {
      time_t t = (time_t) tloc;
#ifdef _REENTRANT
      struct tm tpa;
      struct tm *tp = localtime_r(&t, &tpa);
#else
      struct tm *tp = localtime(&t);
#endif
      year   = tp->tm_year;
      month  = tp->tm_mon + 1;
      day    = tp->tm_mday;
      hour   = tp->tm_hour;
      min    = tp->tm_min;
      sec    = tp->tm_sec;
   }

   fDatime = (year-95)<<26 | month<<22 | day<<17 | hour<<12 | min<<6 | sec;
}

//______________________________________________________________________________
void TDatime::Set(Int_t date, Int_t time)
{
   // Set date and time. Data must be in format 980418 or 19980418 and time in
   // 224512 (second precision). The date must
   // be >= 950101.
   // For years >= 2000, date can be given in the form 20001127 or 1001127
   // internally the date will be converted to 1001127

   if (date > 19000000) date -= 19000000;
   if (date < 950101) {
      Error("TDatime::Set", "year smaller than 1995");
      return;
   }

   Int_t year  = date/10000;
   Int_t month = (date-year*10000)/100;
   Int_t day   = date%100;

   Int_t hour, min, sec;

   hour = time/10000;
   min  = (time-hour*10000)/100;
   sec  = time%100;

   fDatime = (year-95)<<26 | month<<22 | day<<17 | hour<<12 | min<<6 | sec;
}

//______________________________________________________________________________
void TDatime::Set(Int_t year, Int_t month, Int_t day,
                  Int_t hour, Int_t min, Int_t sec)
{
   // Set date and time. Year may be xx where 95 <= xx <= 158 (158 being 2058).
   // The year must be >= 1995.

   if (year < 159) year += 1900;
   if (year < 1995) {
      Error("TDatime::Set", "year must be >= 1995");
      return;
   }

   fDatime = (year-1995)<<26 | month<<22 | day<<17 | hour<<12 | min<<6 | sec;
}

//______________________________________________________________________________
void TDatime::Set(const char* sqlDateTime)
{
   // Expects as input a string in SQL date/time compatible format, like:
   // yyyy-mm-dd hh:mm:ss.

   Int_t yy, mm, dd, hh, mi, ss;

   if (sscanf(sqlDateTime, "%d-%d-%d %d:%d:%d", &yy, &mm, &dd, &hh, &mi, &ss) == 6)
      Set(yy, mm, dd, hh, mi, ss);
   else {
      Error("TDatime(sqlDatTime)", "input string not in right format, set"
            " to current date/time");
      Set();
   }
}

//______________________________________________________________________________
void TDatime::Streamer(TBuffer &b)
{
   // Stream a object of type TDatime.

   if (b.IsReading()) {
      b >> fDatime;
   } else {
      b << fDatime;
   }
}

//______________________________________________________________________________
void TDatime::GetDateTime(UInt_t datetime, Int_t &date, Int_t &time)
{
   // Static function that returns the date and time. The input is
   // in TDatime format (as obtained via TDatime::Get()).
   // Date is returned in the format 950223  February 23 1995.
   // Time is returned in the format 102459 10h 24m 59s.

   UInt_t year  = datetime>>26;
   UInt_t month = (datetime<<6)>>28;
   UInt_t day   = (datetime<<10)>>27;
   UInt_t hour  = (datetime<<15)>>27;
   UInt_t min   = (datetime<<20)>>26;
   UInt_t sec   = (datetime<<26)>>26;
   date         =  10000*(year+1995) + 100*month + day;
   time         =  10000*hour + 100*min + sec;
}
 TDatime.cxx:1
 TDatime.cxx:2
 TDatime.cxx:3
 TDatime.cxx:4
 TDatime.cxx:5
 TDatime.cxx:6
 TDatime.cxx:7
 TDatime.cxx:8
 TDatime.cxx:9
 TDatime.cxx:10
 TDatime.cxx:11
 TDatime.cxx:12
 TDatime.cxx:13
 TDatime.cxx:14
 TDatime.cxx:15
 TDatime.cxx:16
 TDatime.cxx:17
 TDatime.cxx:18
 TDatime.cxx:19
 TDatime.cxx:20
 TDatime.cxx:21
 TDatime.cxx:22
 TDatime.cxx:23
 TDatime.cxx:24
 TDatime.cxx:25
 TDatime.cxx:26
 TDatime.cxx:27
 TDatime.cxx:28
 TDatime.cxx:29
 TDatime.cxx:30
 TDatime.cxx:31
 TDatime.cxx:32
 TDatime.cxx:33
 TDatime.cxx:34
 TDatime.cxx:35
 TDatime.cxx:36
 TDatime.cxx:37
 TDatime.cxx:38
 TDatime.cxx:39
 TDatime.cxx:40
 TDatime.cxx:41
 TDatime.cxx:42
 TDatime.cxx:43
 TDatime.cxx:44
 TDatime.cxx:45
 TDatime.cxx:46
 TDatime.cxx:47
 TDatime.cxx:48
 TDatime.cxx:49
 TDatime.cxx:50
 TDatime.cxx:51
 TDatime.cxx:52
 TDatime.cxx:53
 TDatime.cxx:54
 TDatime.cxx:55
 TDatime.cxx:56
 TDatime.cxx:57
 TDatime.cxx:58
 TDatime.cxx:59
 TDatime.cxx:60
 TDatime.cxx:61
 TDatime.cxx:62
 TDatime.cxx:63
 TDatime.cxx:64
 TDatime.cxx:65
 TDatime.cxx:66
 TDatime.cxx:67
 TDatime.cxx:68
 TDatime.cxx:69
 TDatime.cxx:70
 TDatime.cxx:71
 TDatime.cxx:72
 TDatime.cxx:73
 TDatime.cxx:74
 TDatime.cxx:75
 TDatime.cxx:76
 TDatime.cxx:77
 TDatime.cxx:78
 TDatime.cxx:79
 TDatime.cxx:80
 TDatime.cxx:81
 TDatime.cxx:82
 TDatime.cxx:83
 TDatime.cxx:84
 TDatime.cxx:85
 TDatime.cxx:86
 TDatime.cxx:87
 TDatime.cxx:88
 TDatime.cxx:89
 TDatime.cxx:90
 TDatime.cxx:91
 TDatime.cxx:92
 TDatime.cxx:93
 TDatime.cxx:94
 TDatime.cxx:95
 TDatime.cxx:96
 TDatime.cxx:97
 TDatime.cxx:98
 TDatime.cxx:99
 TDatime.cxx:100
 TDatime.cxx:101
 TDatime.cxx:102
 TDatime.cxx:103
 TDatime.cxx:104
 TDatime.cxx:105
 TDatime.cxx:106
 TDatime.cxx:107
 TDatime.cxx:108
 TDatime.cxx:109
 TDatime.cxx:110
 TDatime.cxx:111
 TDatime.cxx:112
 TDatime.cxx:113
 TDatime.cxx:114
 TDatime.cxx:115
 TDatime.cxx:116
 TDatime.cxx:117
 TDatime.cxx:118
 TDatime.cxx:119
 TDatime.cxx:120
 TDatime.cxx:121
 TDatime.cxx:122
 TDatime.cxx:123
 TDatime.cxx:124
 TDatime.cxx:125
 TDatime.cxx:126
 TDatime.cxx:127
 TDatime.cxx:128
 TDatime.cxx:129
 TDatime.cxx:130
 TDatime.cxx:131
 TDatime.cxx:132
 TDatime.cxx:133
 TDatime.cxx:134
 TDatime.cxx:135
 TDatime.cxx:136
 TDatime.cxx:137
 TDatime.cxx:138
 TDatime.cxx:139
 TDatime.cxx:140
 TDatime.cxx:141
 TDatime.cxx:142
 TDatime.cxx:143
 TDatime.cxx:144
 TDatime.cxx:145
 TDatime.cxx:146
 TDatime.cxx:147
 TDatime.cxx:148
 TDatime.cxx:149
 TDatime.cxx:150
 TDatime.cxx:151
 TDatime.cxx:152
 TDatime.cxx:153
 TDatime.cxx:154
 TDatime.cxx:155
 TDatime.cxx:156
 TDatime.cxx:157
 TDatime.cxx:158
 TDatime.cxx:159
 TDatime.cxx:160
 TDatime.cxx:161
 TDatime.cxx:162
 TDatime.cxx:163
 TDatime.cxx:164
 TDatime.cxx:165
 TDatime.cxx:166
 TDatime.cxx:167
 TDatime.cxx:168
 TDatime.cxx:169
 TDatime.cxx:170
 TDatime.cxx:171
 TDatime.cxx:172
 TDatime.cxx:173
 TDatime.cxx:174
 TDatime.cxx:175
 TDatime.cxx:176
 TDatime.cxx:177
 TDatime.cxx:178
 TDatime.cxx:179
 TDatime.cxx:180
 TDatime.cxx:181
 TDatime.cxx:182
 TDatime.cxx:183
 TDatime.cxx:184
 TDatime.cxx:185
 TDatime.cxx:186
 TDatime.cxx:187
 TDatime.cxx:188
 TDatime.cxx:189
 TDatime.cxx:190
 TDatime.cxx:191
 TDatime.cxx:192
 TDatime.cxx:193
 TDatime.cxx:194
 TDatime.cxx:195
 TDatime.cxx:196
 TDatime.cxx:197
 TDatime.cxx:198
 TDatime.cxx:199
 TDatime.cxx:200
 TDatime.cxx:201
 TDatime.cxx:202
 TDatime.cxx:203
 TDatime.cxx:204
 TDatime.cxx:205
 TDatime.cxx:206
 TDatime.cxx:207
 TDatime.cxx:208
 TDatime.cxx:209
 TDatime.cxx:210
 TDatime.cxx:211
 TDatime.cxx:212
 TDatime.cxx:213
 TDatime.cxx:214
 TDatime.cxx:215
 TDatime.cxx:216
 TDatime.cxx:217
 TDatime.cxx:218
 TDatime.cxx:219
 TDatime.cxx:220
 TDatime.cxx:221
 TDatime.cxx:222
 TDatime.cxx:223
 TDatime.cxx:224
 TDatime.cxx:225
 TDatime.cxx:226
 TDatime.cxx:227
 TDatime.cxx:228
 TDatime.cxx:229
 TDatime.cxx:230
 TDatime.cxx:231
 TDatime.cxx:232
 TDatime.cxx:233
 TDatime.cxx:234
 TDatime.cxx:235
 TDatime.cxx:236
 TDatime.cxx:237
 TDatime.cxx:238
 TDatime.cxx:239
 TDatime.cxx:240
 TDatime.cxx:241
 TDatime.cxx:242
 TDatime.cxx:243
 TDatime.cxx:244
 TDatime.cxx:245
 TDatime.cxx:246
 TDatime.cxx:247
 TDatime.cxx:248
 TDatime.cxx:249
 TDatime.cxx:250
 TDatime.cxx:251
 TDatime.cxx:252
 TDatime.cxx:253
 TDatime.cxx:254
 TDatime.cxx:255
 TDatime.cxx:256
 TDatime.cxx:257
 TDatime.cxx:258
 TDatime.cxx:259
 TDatime.cxx:260
 TDatime.cxx:261
 TDatime.cxx:262
 TDatime.cxx:263
 TDatime.cxx:264
 TDatime.cxx:265
 TDatime.cxx:266
 TDatime.cxx:267
 TDatime.cxx:268
 TDatime.cxx:269
 TDatime.cxx:270
 TDatime.cxx:271
 TDatime.cxx:272
 TDatime.cxx:273
 TDatime.cxx:274
 TDatime.cxx:275
 TDatime.cxx:276
 TDatime.cxx:277
 TDatime.cxx:278
 TDatime.cxx:279
 TDatime.cxx:280
 TDatime.cxx:281
 TDatime.cxx:282
 TDatime.cxx:283
 TDatime.cxx:284
 TDatime.cxx:285
 TDatime.cxx:286
 TDatime.cxx:287
 TDatime.cxx:288
 TDatime.cxx:289
 TDatime.cxx:290
 TDatime.cxx:291
 TDatime.cxx:292
 TDatime.cxx:293
 TDatime.cxx:294
 TDatime.cxx:295
 TDatime.cxx:296
 TDatime.cxx:297
 TDatime.cxx:298
 TDatime.cxx:299
 TDatime.cxx:300
 TDatime.cxx:301
 TDatime.cxx:302
 TDatime.cxx:303
 TDatime.cxx:304
 TDatime.cxx:305
 TDatime.cxx:306
 TDatime.cxx:307
 TDatime.cxx:308
 TDatime.cxx:309
 TDatime.cxx:310
 TDatime.cxx:311
 TDatime.cxx:312
 TDatime.cxx:313
 TDatime.cxx:314
 TDatime.cxx:315
 TDatime.cxx:316
 TDatime.cxx:317
 TDatime.cxx:318
 TDatime.cxx:319
 TDatime.cxx:320
 TDatime.cxx:321
 TDatime.cxx:322
 TDatime.cxx:323
 TDatime.cxx:324
 TDatime.cxx:325
 TDatime.cxx:326
 TDatime.cxx:327
 TDatime.cxx:328
 TDatime.cxx:329
 TDatime.cxx:330
 TDatime.cxx:331
 TDatime.cxx:332
 TDatime.cxx:333
 TDatime.cxx:334
 TDatime.cxx:335
 TDatime.cxx:336
 TDatime.cxx:337
 TDatime.cxx:338
 TDatime.cxx:339
 TDatime.cxx:340
 TDatime.cxx:341
 TDatime.cxx:342
 TDatime.cxx:343
 TDatime.cxx:344
 TDatime.cxx:345
 TDatime.cxx:346
 TDatime.cxx:347
 TDatime.cxx:348
 TDatime.cxx:349
 TDatime.cxx:350
 TDatime.cxx:351
 TDatime.cxx:352
 TDatime.cxx:353
 TDatime.cxx:354
 TDatime.cxx:355
 TDatime.cxx:356
 TDatime.cxx:357
 TDatime.cxx:358
 TDatime.cxx:359
 TDatime.cxx:360
 TDatime.cxx:361
 TDatime.cxx:362
 TDatime.cxx:363
 TDatime.cxx:364
 TDatime.cxx:365
 TDatime.cxx:366
 TDatime.cxx:367
 TDatime.cxx:368
 TDatime.cxx:369
 TDatime.cxx:370
 TDatime.cxx:371
 TDatime.cxx:372
 TDatime.cxx:373
 TDatime.cxx:374
 TDatime.cxx:375
 TDatime.cxx:376
 TDatime.cxx:377
 TDatime.cxx:378
 TDatime.cxx:379
 TDatime.cxx:380
 TDatime.cxx:381
 TDatime.cxx:382
 TDatime.cxx:383
 TDatime.cxx:384
 TDatime.cxx:385
 TDatime.cxx:386
 TDatime.cxx:387
 TDatime.cxx:388
 TDatime.cxx:389
 TDatime.cxx:390
 TDatime.cxx:391
 TDatime.cxx:392
 TDatime.cxx:393
 TDatime.cxx:394
 TDatime.cxx:395
 TDatime.cxx:396
 TDatime.cxx:397
 TDatime.cxx:398
 TDatime.cxx:399
 TDatime.cxx:400
 TDatime.cxx:401
 TDatime.cxx:402
 TDatime.cxx:403
 TDatime.cxx:404
 TDatime.cxx:405
 TDatime.cxx:406
 TDatime.cxx:407
 TDatime.cxx:408
 TDatime.cxx:409
 TDatime.cxx:410
 TDatime.cxx:411
 TDatime.cxx:412
 TDatime.cxx:413
 TDatime.cxx:414
 TDatime.cxx:415
 TDatime.cxx:416
 TDatime.cxx:417
 TDatime.cxx:418
 TDatime.cxx:419
 TDatime.cxx:420
 TDatime.cxx:421
 TDatime.cxx:422
 TDatime.cxx:423
 TDatime.cxx:424
 TDatime.cxx:425
 TDatime.cxx:426
 TDatime.cxx:427
 TDatime.cxx:428
 TDatime.cxx:429
 TDatime.cxx:430
 TDatime.cxx:431
 TDatime.cxx:432
 TDatime.cxx:433
 TDatime.cxx:434
 TDatime.cxx:435
 TDatime.cxx:436
 TDatime.cxx:437
 TDatime.cxx:438
 TDatime.cxx:439
 TDatime.cxx:440
 TDatime.cxx:441
 TDatime.cxx:442
 TDatime.cxx:443
 TDatime.cxx:444
 TDatime.cxx:445