/data3/calcul/jacquem/working_dir/Micromegas/micromegasFrameWork/lcio/src/cpp/src/UTIL/LCTime.cc

Go to the documentation of this file.
00001 #include "UTIL/LCTime.h"
00002 #include "Exceptions.h"
00003 #include <time.h>
00004 
00005 #include <sstream>
00006 #include <iomanip>
00007 #include <cstdlib>
00008 
00009 // the canonical year zero
00010 #define YEAR0 1970 
00011 
00012 // seconds per min, hour, day
00013 #define SPM 60
00014 #define SPH 3600   // 60*60
00015 #define SPD 86400  // 60*60*24
00016 
00017 #define DPY 365 // days per year - no leap year
00018 #define NPS 1000000000LL // ns per s - need 64bit to force result of conversion to be 64bit
00019 
00020 using namespace EVENT ;
00021 
00022 #include <iostream>
00023 using namespace std ;
00024 
00025 namespace UTIL{
00026 
00027   int LCTime::dpm[13]   = { 0,31,28,31,30,31,30,31,31,30,31,30,31 } ;
00028 
00029 
00030   LCTime::LCTime(){
00031 
00032     time_t now ;
00033     time ( &now ) ;
00034 
00035     _t = now * NPS ;
00036 
00037     convertToCalTime() ;
00038 
00039 
00040 //     // selftest :
00041 //     cout << "--- date : " << getDateString() 
00042 //       << endl 
00043 //       << "--- time: " << _t << endl 
00044 //       << endl ;
00045 
00046 //     convertFromCalTime() ;
00047 //     convertToCalTime() ;
00048 
00049 //     cout << "after reconversion  " << endl ;
00050 //     // selftest :
00051 //     cout << "--- date : " << getDateString() 
00052 //       << endl 
00053 //       << "--- time: " << _t << endl 
00054 //       << endl ;
00055 
00056   }
00057 
00058   LCTime::LCTime( long64 time) : _t( time )  {
00059 
00060     convertToCalTime() ;
00061   }
00062 
00063 
00064   LCTime::LCTime(int year, int month, int day, int hour, int min, int s ){
00065     
00066 
00067     _d.year = year  ;
00068     _d.month = month  ;
00069     _d.day = day  ;
00070     _d.hour = hour  ;
00071     _d.min = min  ;
00072     _d.sec = s  ;
00073     _d.ns = 0 ; 
00074     
00075     // do some sanity checks on date:
00076     if(  year  < YEAR0               || 
00077          month < 0     || month > 12 ||
00078          day   < 0     || day   > daysInMonth( month , year ) ){
00079 
00080       throw Exception( "LCTime::LCTime() invalid date:"+ getDateString() ) ;
00081     } 
00082 
00083 
00084     convertFromCalTime() ;
00085   }
00086   
00087   LCTime::LCTime( int unixTime ) {
00088 
00089     _t = unixTime * NPS ;
00090 
00091     convertToCalTime() ;
00092   }
00093   
00094 
00095 
00096   void LCTime::convertToCalTime(){
00097 
00098     // initialize date to 1.1.1970
00099     _d.year =  YEAR0  ;
00100     _d.month = 1 ; 
00101     _d.day = 1 ;
00102     _d.hour = 0 ;
00103     _d.min = 0 ;
00104     _d.sec = 0 ;
00105     _d.ns = 0 ;
00106 
00107     // don't support negative times 
00108     if( _t < 0LL ) {      
00109       _t = 0 ;
00110       return ;  // map to 1.1.1970 00:00:00
00111     }
00112 
00113     // start with unix time, i.e. seconds since 1.1.1970
00114     long64 s = _t / NPS ; 
00115     _d.ns = _t % NPS ;
00116 
00117     // total number of days 
00118     int nDays = s / SPD ;
00119 
00120     int daysLeft ;
00121 
00122     while( (daysLeft = nDays - daysInYear( _d.year ) )  >= 0 ){
00123       nDays = daysLeft ;
00124       _d.year ++ ;
00125     }
00126     
00127 //     std::cout << " ---- daysLeft : " << daysLeft << "  year: " <<   _d.year << std::endl ;
00128     
00129     while( (daysLeft = nDays - daysInMonth( _d.month ,  _d.year ) ) >= 0 ){
00130       nDays = daysLeft ;
00131       _d.month ++ ;
00132     }
00133     
00134 //     std::cout << " ---- daysLeft : " << daysLeft << "  month: " <<   _d.month << std::endl ;
00135     
00136     _d.day +=  nDays ;
00137     
00138 //     std::cout << " ---- daysLeft : " <<  _d.day << std::endl ;
00139     
00140 
00141 //     if( _d.day > daysInMonth( _d.month ,  _d.year ) ) { // happens on first day of a month
00142 //       if( _d.month == 12 ) {
00143 //      _d.year += 1 ;
00144 //      _d.month = 1 ;
00145 //       } else {
00146 //      _d.month += 1 ; 
00147 //       }
00148 //       _d.day = 1 ;
00149 //     }
00150 
00151 
00152 
00153     s = s % SPD ; // the seconds of the current day
00154 
00155     _d.hour = s / SPH ; // the hours of the current day
00156 
00157     s = s % SPH ; // the seconds of the current hour
00158     
00159     _d.min  = s / SPM ; // the min of the current hour
00160 
00161     _d.sec = s % SPM  ;  // secs
00162 
00163   }
00164   
00165   void LCTime::convertFromCalTime(){
00166     
00167     // don't support dates before 1.1.1970 00:00:00
00168     if( _d.year < YEAR0 ) {   // map to 1.1.1970 00:00:00
00169       _t = -1  ;  
00170       convertToCalTime() ;
00171     }
00172     
00173 
00174     // add up all days that have passed
00175     unsigned nDays = 0 ; 
00176     
00177     for( int y = YEAR0 ; y < _d.year ; y ++ ){  
00178       nDays += daysInYear( y ) ; 
00179     }
00180 
00181     for( int m = 1 ;  m < _d.month ; m ++ ){
00182       nDays += daysInMonth( m , _d.year ) ; 
00183     }
00184 
00185     nDays += _d.day - 1 ;  // current day hasn't passed yet
00186 
00187     // add up the seconds
00188     _t = nDays * SPD + _d.hour  * SPH + _d.min * SPM + _d.sec ;
00189  
00190     // now make ns
00191     _t *= NPS ;
00192 
00193   }
00194 
00195    
00196   int LCTime::daysInYear( int year ) {
00197     int d = DPY ;
00198     if( isLeapYear( year ) ) d++ ;
00199     return d ;
00200   }
00201   
00202   int LCTime::daysInMonth( int month , int year ) {
00203     
00204     if( month < 1 || month > 12 ) 
00205       return 0 ;
00206     int d = dpm[ month ] ;
00207     
00208     if( month == 2 &&  isLeapYear( year ) ) d++ ;
00209     return d ;
00210   }
00211   
00212   
00213   void LCTime::operator+=(EVENT::long64 t) {
00214     _t += t ;
00215     convertToCalTime() ;
00216   }
00217 
00218 
00219 
00220   std::string LCTime::getDateString() {
00221 
00222     std::stringstream out ;
00223 
00224     // dd.mm.yyyy  hh:mm:ss._ms_us_ns
00225     out << setfill ('0') 
00226         << std::setw(2) << (int) _d.day 
00227         << std::setw(1) << "." 
00228         << std::setw(2) << (int) _d.month 
00229         << std::setw(1) << "." 
00230         << std::setw(4) << _d.year
00231         << std::setw(1) << "  " 
00232         << std::setw(2) << (int) _d.hour 
00233         << std::setw(1) << ":"   
00234         << std::setw(2) << (int) _d.min 
00235         << std::setw(1) << ":"   
00236         << std::setw(2) << (int) _d.sec 
00237         << std::setw(1) << "."   
00238         << std::setw(9) << (int) _d.ns  ;  
00239     
00240     return out.str() ;
00241   }
00242 
00243 
00244   bool LCTime::test( int nDates ) {
00245     
00246     std::cout << "LCTime::test: test LCTime with " << nDates << " random dates " << std::endl ;
00247 
00248     LCTime lcTime ;
00249 
00250     for(int i=0; i<nDates;i++){
00251 
00252       CalendarTime date ;
00253       date.year  = int( YEAR0  +  75  * ( 1.*std::rand()/RAND_MAX )  ) ;
00254       date.month = int( 1     +  12  * ( 1.*std::rand()/RAND_MAX )  ) ;
00255 
00256       date.day   = int( 1  +  lcTime.daysInMonth( date.month, date.year) * ( 1.*std::rand()/RAND_MAX )  ) ;
00257       date.hour  = int( 0  +  24 * ( 1.*std::rand()/RAND_MAX )  ) ;
00258       date.min   = int( 0  +  60 * ( 1.*std::rand()/RAND_MAX )  ) ;
00259       date.sec   = int( 0  +  60 * ( 1.*std::rand()/RAND_MAX )  ) ;
00260       date.ns    =int(  0   ) ;
00261 
00262 
00263 
00264       LCTime testTime0( (int) date.year, (int) date.month, (int) date.day, 
00265                         (int) date.hour, (int) date.min, (int) date.sec ) ;
00266 
00267       LCTime testTime1( testTime0.timeStamp() ) ;
00268 
00269 
00270 //       if( date.day == lcTime.daysInMonth( date.month, date.year) ) {
00271 //      std::cout << " last day in month : " << testTime0.getDateString() << std::endl ;
00272 //       }
00273 
00274 //       std::cout << " random date: " 
00275 //              << setfill ('0') 
00276 //              << std::setw(2) << (int) date.day 
00277 //              << std::setw(1) << "." 
00278 //              << std::setw(2) << (int) date.month 
00279 //              << std::setw(1) << "." 
00280 //              << std::setw(4) << date.year
00281 //              << std::setw(1) << "  " 
00282 //              << std::setw(2) << (int) date.hour 
00283 //              << std::setw(1) << ":"   
00284 //              << std::setw(2) << (int) date.min 
00285 //              << std::setw(1) << ":"   
00286 //              << std::setw(2) << (int) date.sec 
00287 //              << std::setw(1) << "."   
00288 //              << std::setw(9) << (int) date.ns  
00289 //              << std::endl ;
00290  
00291 //       std::cout << " time0 : " << testTime0.getDateString() << std::endl ;
00292 //       std::cout << " time1 : " << testTime1.getDateString() << std::endl ;
00293 //       std::cout << "--------------------------------------------------------" << std::endl ;
00294 
00295 
00296       if( testTime0.getDateString() !=  testTime1.getDateString() ){
00297         
00298         std::cout <<  " Erorr: incompatible date strings found: " << std::endl ;
00299         
00300         std::cout << " time0 : " << testTime0.getDateString() << std::endl ;
00301         std::cout << " time1 : " << testTime1.getDateString() << std::endl ;
00302         
00303       }
00304       if( date.year  !=  testTime0.year()  ||  
00305           date.month !=  testTime0.month() || 
00306           date.day   !=  testTime0.day()   ||    
00307           date.hour  !=  testTime0.hour()  ||   
00308           date.min   !=  testTime0.min()   ||    
00309           date.sec   !=  testTime0.sec()   ||    
00310           date.ns    !=  testTime0.ns () ) {
00311 
00312         std::cout <<  " Erorr: wrong date in LCTime: " << std::endl ;
00313         std::cout << " random date: " 
00314                   << setfill ('0') 
00315                   << std::setw(2) << (int) date.day 
00316                   << std::setw(1) << "." 
00317                   << std::setw(2) << (int) date.month 
00318                   << std::setw(1) << "." 
00319                   << std::setw(4) << date.year
00320                   << std::setw(1) << "  " 
00321                   << std::setw(2) << (int) date.hour 
00322                   << std::setw(1) << ":"   
00323                   << std::setw(2) << (int) date.min 
00324                   << std::setw(1) << ":"   
00325                   << std::setw(2) << (int) date.sec 
00326                   << std::setw(1) << "."   
00327                   << std::setw(9) << (int) date.ns  
00328                   << std::endl ;
00329 
00330         std::cout << " time0 :      " << testTime0.getDateString() << std::endl ;
00331         
00332       }
00333 
00334     }
00335 
00336     return true ;
00337   }
00338 
00339 }

Generated on Mon Jan 7 13:15:21 2013 for MicromegasFramework by  doxygen 1.4.7