Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:16:20

0001 //-----------------------------------------------------------------------------
0002 //
0003 //  The PHOOL's Software
0004 //  Copyright (C) PHENIX collaboration, 1999
0005 //
0006 //  Implementation of class PHTimeStamp
0007 //
0008 //  Author: Matthias Messer
0009 //-----------------------------------------------------------------------------
0010 #include "PHTimeStamp.h"
0011 
0012 #include <climits>
0013 #include <cstdlib>
0014 #include <cstring>
0015 #include <iostream>
0016 
0017 const unsigned long long PHTimeStamp::PHFarFuture = ULLONG_MAX;
0018 
0019 #ifdef WIN32
0020 const phtime_t ticOffset = 35067168000000000UL;
0021 #else
0022 const phtime_t ticOffset = 35067168000000000ULL;
0023 #endif
0024 
0025 const phtime_t ticFactor = 10000000;
0026 
0027 PHTimeStamp::PHTimeStamp()
0028 {
0029   setTics(time(nullptr));
0030 
0031   setenv("TZ", "EST5EDT", 1);
0032 }
0033 
0034 PHTimeStamp::PHTimeStamp(const int year, const int month, const int day, const int hour, const int minute, const int second, const int fraction)
0035 {
0036   set(year, month, day, hour, minute, second, fraction);
0037   setenv("TZ", "EST5EDT", 1);
0038 }
0039 
0040 PHTimeStamp::PHTimeStamp(const time_t t)
0041 {
0042   setTics(t);
0043   setenv("TZ", "EST5EDT", 1);
0044 }
0045 
0046 void PHTimeStamp::set(const int year, const int month, const int day,
0047                       const int hour, const int minute,
0048                       const int second, const int fraction)
0049 {
0050   if (year < 1900)
0051   {
0052     setTics(0);
0053     return;
0054   }
0055   tm newTime{};
0056   newTime.tm_year = year - 1900;
0057   newTime.tm_mon = month - 1;
0058   newTime.tm_mday = day;
0059   newTime.tm_hour = hour;
0060   newTime.tm_min = minute;
0061   newTime.tm_sec = second;
0062 
0063   // This tells mktime that it's not known whether it's daylight
0064   // savings time or not.
0065   newTime.tm_isdst = -1;
0066 
0067   setTics(mktime(&newTime));
0068   binaryTime += fraction;
0069 }
0070 
0071 void PHTimeStamp::set(const char *timeString)
0072 {
0073 #ifndef WIN32
0074   tm newTime{};
0075   strptime(timeString, "%A %h %d %H:%M:%S %Y", &newTime);
0076   setTics(mktime(&newTime));
0077 #endif
0078 }
0079 
0080 void PHTimeStamp::setToSystemTime()
0081 {
0082   setTics(time(nullptr));
0083 }
0084 
0085 time_t PHTimeStamp::getTics() const
0086 {
0087   return binaryTimeToTics(binaryTime);
0088 }
0089 
0090 void PHTimeStamp::setTics(const time_t tics)
0091 {
0092   binaryTime = ticsToBinaryTime(tics);
0093 }
0094 
0095 void PHTimeStamp::setBinTics(const phtime_t t)
0096 {
0097   binaryTime = t;
0098 }
0099 
0100 phtime_t PHTimeStamp::ticsToBinaryTime(time_t tics)
0101 {
0102   return (tics * ticFactor) + ticOffset;
0103 }
0104 
0105 time_t PHTimeStamp::binaryTimeToTics(phtime_t bt)
0106 {
0107   return (bt - ticOffset) / ticFactor;
0108 }
0109 
0110 int PHTimeStamp::isInRange(const PHTimeStamp &t1, const PHTimeStamp &t2) const
0111 {
0112   return (binaryTime > t1.getBinaryTime() && binaryTime < t2.getBinaryTime());
0113 }
0114 
0115 //
0116 // Operators
0117 //
0118 int PHTimeStamp::operator==(const PHTimeStamp &t) const
0119 {
0120   return binaryTime == t.getBinaryTime();
0121 }
0122 
0123 int PHTimeStamp::operator!=(const PHTimeStamp &t) const
0124 {
0125   return binaryTime != t.getBinaryTime();
0126 }
0127 
0128 int PHTimeStamp::operator>(const PHTimeStamp &t) const
0129 {
0130   return binaryTime > t.getBinaryTime();
0131 }
0132 
0133 int PHTimeStamp::operator<(const PHTimeStamp &t) const
0134 {
0135   return binaryTime < t.getBinaryTime();
0136 }
0137 
0138 int PHTimeStamp::operator>=(const PHTimeStamp &t) const
0139 {
0140   return binaryTime >= t.getBinaryTime();
0141 }
0142 
0143 int PHTimeStamp::operator<=(const PHTimeStamp &t) const
0144 {
0145   return binaryTime <= t.getBinaryTime();
0146 }
0147 
0148 PHTimeStamp PHTimeStamp::operator+=(time_t t)
0149 {
0150   binaryTime += t * ticFactor;
0151   return *this;
0152 }
0153 
0154 PHTimeStamp PHTimeStamp::operator-=(time_t t)
0155 {
0156   binaryTime -= t * ticFactor;
0157   return *this;
0158 }
0159 
0160 void PHTimeStamp::print() const
0161 {
0162   std::cout << *this << std::endl;
0163 }
0164 char *PHTimeStamp::formatTimeString() const
0165 {
0166   // this one gives, for naming purposes, the time string
0167   // without blanks
0168 
0169   time_t tics = getTics();
0170   char timeString[25];
0171   timeString[24] = '\0';
0172   strncpy(timeString, ctime(&tics), 24);
0173   char *line = new char[25];
0174 
0175   char *u = strtok(timeString, " ");
0176 
0177   if (u)
0178   {
0179     strcpy(line, u);
0180   }
0181 
0182   while ((u = strtok(nullptr, " ")))
0183   {
0184     strcat(line, "_");
0185     strcat(line, u);
0186   }
0187   return line;
0188 }
0189 
0190 //
0191 // Non member operators and functions
0192 //
0193 
0194 PHTimeStamp operator+(const PHTimeStamp &t1, time_t t2)
0195 {
0196   PHTimeStamp newTime = t1;
0197   newTime += t2;
0198   return newTime;
0199 }
0200 
0201 PHTimeStamp operator-(const PHTimeStamp &t1, time_t t2)
0202 {
0203   PHTimeStamp newTime = t1;
0204   newTime -= t2;
0205   return newTime;
0206 }
0207 
0208 time_t operator-(const PHTimeStamp &t1, const PHTimeStamp &t2)
0209 {
0210   return t1.getTics() - t2.getTics();
0211 }
0212 
0213 std::ostream &operator<<(std::ostream &s, const PHTimeStamp &t)
0214 {
0215   time_t tics = t.getTics();
0216   char timeString[25];
0217   timeString[24] = '\0';
0218   strncpy(timeString, ctime(&tics), 24);
0219   return s << timeString;
0220 }
0221 
0222 std::istream &operator>>(std::istream &s, PHTimeStamp &t)
0223 {
0224   char timeString[25];
0225   s.getline(timeString, 25);
0226   t.set(timeString);
0227   return s;
0228 }