File indexing completed on 2025-08-05 08:16:20
0001
0002
0003
0004
0005
0006
0007
0008
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
0064
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
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
0167
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
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 }