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].
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].
static Time current(void)
Returns the current time.
tm utc(int *nsecpart=0) const
Break up the time to the standard library representation, keeping it in UTC.
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)
Time(void)
Initialize an empty (zero) time value.
int weekday(bool local) const
Get the day of week, numbered [0,6] and starting from Sunday.
int nsecond(void) const
Get the nanoseconds.
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].