13 using namespace Gaudi;
63 # define SECS_1601_TO_1970 ((369 * 365 + 89) * 86400ui64) 67 static time_t timegm (
struct tm *t) {
73 return t1 + (t1 - t2);
81 int hour,
int min,
int sec,
85 memset (&val, 0,
sizeof (val));
91 val.tm_year = year > 1900 ? year - 1900 :
year;
100 Time Time::from (
const FILETIME *systime) {
106 t = (t - SECS_1601_TO_1970 * (
SEC_NSECS/100)) * 100;
116 GetSystemTimeAsFileTime (&ftime);
117 return from (&ftime);
120 if (gettimeofday (&tv,
nullptr) != 0) {
123 tag <<
"errno=" << errno;
124 if( strerror_r(errno, buf, 256) == 0 ) {
127 msg <<
"Unknown error retrieving current time";
131 return Time (tv.tv_sec, tv.tv_usec * 1000);
138 return Time (local ? mktime(&tmp) : timegm(&tmp), 0) + diff;
149 time_t val = (time_t)(
m_nsecs / SEC_NSECS);
153 localtime_r(&val, &retval);
155 gmtime_r(&val, &retval);
164 return split (
false, nsecpart);
171 return split (
true, nsecpart);
176 return split (local).tm_year + 1900;
181 return split (local).tm_mon;
186 return split (local).tm_mday;
191 return split (local).tm_hour;
196 return split (local).tm_min;
203 return split (local).tm_sec;
215 return split (local).tm_wday;
222 return split (local).tm_isdst > 0;
235 tm localtm =
local ();
236 n = localtm.tm_gmtoff;
237 if (daylight) *daylight = localtm.tm_isdst;
242 localtime_s(&localtm, &utctime);
243 int savedaylight = localtm.tm_isdst;
245 gmtime_s(&gmt, &utctime);
247 gmt.tm_isdst = savedaylight;
248 n = utctime - mktime (&gmt);
250 if (daylight) *daylight = savedaylight;
258 #pragma warning(push) 259 #pragma warning(disable:4996) 266 tm localtm =
local ();
267 if (daylight) *daylight = localtm.tm_isdst;
269 return tzname [localtm.tm_isdst > 0 ? 1 : 0];
283 std::string::size_type length = 0;
286 std::string::size_type pos = spec.
find(
"%f");
287 if (std::string::npos != pos) {
291 while (std::string::npos != pos) {
292 if (pos != 0 && spec[pos-1] !=
'%') {
295 pos = spec.
find(
"%f", pos + 1);
298 const int MIN_BUF_SIZE = 128;
302 result.
resize(std::max<std::string::size_type>(result.
size()*2,
303 std::max<std::string::size_type>(spec.
size()*2, MIN_BUF_SIZE))
305 length = ::strftime (&result[0], result.
size(), spec.
c_str(), &
time);
323 TimeAssert( (minwidth >= 1) && (minwidth <= maxwidth) && (maxwidth <= 9),
324 "nanoformat options do not satisfy: 1 <= minwidth <= maxwidth <= 9");
347 struct tm localtm = time.
local ();
349 unsigned mday = localtm.tm_mday;
350 unsigned mon = localtm.tm_mon + 1;
351 unsigned year = (localtm.tm_year > 80 ? localtm.tm_year - 80 : 0);
352 unsigned sec = localtm.tm_sec / 2;
353 unsigned min = localtm.tm_min;
354 unsigned hour = localtm.tm_hour;
355 return (mday << 16 | mon << 21 | year << 25
356 | sec | min << 5 | hour << 11);
366 memset (&localtm, 0,
sizeof (localtm));
367 localtm.tm_mday = (dosDate >> 16) & 0x1f;
368 localtm.tm_mon = ((dosDate >> 21) & 0xf) - 1;
369 localtm.tm_year = ((dosDate >> 25) & 0x7f) + 80;
370 localtm.tm_hour = (dosDate >> 11) & 0x1f;
371 localtm.tm_min = (dosDate >> 5) & 0x3f;
372 localtm.tm_sec = (dosDate & 0x1f) * 2;
373 localtm.tm_isdst = -1;
375 return Time (mktime (&localtm), 0);
int hour(bool local) const
Get the hour, numbered [0, 23].
Time()=default
Initialize an empty (zero) time value.
const char * timezone(int *daylight=0) const
Return the local timezone name that applies at this time value.
tm split(bool local, int *nsecpart=0) const
Break up the time to the standard representation, either in UTC (if local is false) or local time (if...
static Time build(bool local, const tm &base, TimeSpan diff=0)
Construct a time from local time base and a delta diff.
Define general base for Gaudi exception.
int day(bool local) const
Get the day of month, numbered [1,31].
static unsigned toDosDate(Time time)
Convert the Time t into a MS-DOS date format.
int month(bool local) const
Get the month, numbered [0,11].
tm utc(int *nsecpart=0) const
Break up the time to the standard library representation, keeping it in UTC.
static Time current()
Returns the current time.
bool isdst(bool local) const
Check whether daylight savings is in effect.
void TimeAssert(bool cond, const std::string &msg="time assertion failed") const
int second(bool local) const
Get the seconds, numbered [0,61] (allowing one or two leap seconds, years with leap seconds can have ...
tm local(int *nsecpart=0) const
Break up the time to the standard library representation, converting it first to local time...
static const ValueType SEC_NSECS
Nanoseconds in one second.
ValueType utcoffset(int *daylight=0) const
Return the number of nanoseconds that needs to be added to UTC to translate this time to the local ti...
std::string nanoformat(size_t minwidth=1, size_t maxwidth=9) const
Format the nanosecond fractional part of the time as a string.
static Time fromDosDate(unsigned dosDate)
Convert the MS-DOS date dosDate into a Time.
T find_last_not_of(T...args)
int nsecond() const
Get the nanoseconds.
int weekday(bool local) const
Get the day of week, numbered [0,6] and starting from Sunday.
int year(bool local) const
Get the year.
Helper functions to set/get the application return code.
std::string format(bool local, std::string spec="%c") const
Format the time using strftime.
int minute(bool local) const
Get the minute, numbered [0, 59].