14 using namespace Gaudi;
64 # define SECS_1601_TO_1970 ((369 * 365 + 89) * 86400ui64)
68 static time_t timegm (
struct tm *t) {
70 time_t t1 = mktime (t);
73 time_t t2 = mktime(&gmt);
74 return t1 + (t1 - t2);
82 int hour,
int min,
int sec,
86 memset (&val, 0,
sizeof (val));
92 val.tm_year = year > 1900 ? year - 1900 :
year;
101 Time Time::from (
const FILETIME *systime) {
107 t = (t - SECS_1601_TO_1970 * (
SEC_NSECS/100)) * 100;
117 GetSystemTimeAsFileTime (&ftime);
118 return from (&ftime);
121 if (gettimeofday (&tv, 0) != 0) {
123 std::ostringstream tag,
msg;
124 tag <<
"errno=" << errno;
125 if( strerror_r(errno, buf, 256) == 0 ) {
128 msg <<
"Unknown error retrieving current time";
132 return Time (tv.tv_sec, tv.tv_usec * 1000);
139 return Time (local ? mktime(&tmp) : timegm(&tmp), 0) + diff;
150 time_t val = (time_t)(
m_nsecs / SEC_NSECS);
154 localtime_r(&val, &retval);
156 gmtime_r(&val, &retval);
165 return split (
false, nsecpart);
172 return split (
true, nsecpart);
177 return split (local).tm_year + 1900;
182 return split (local).tm_mon;
187 return split (local).tm_mday;
192 return split (local).tm_hour;
197 return split (local).tm_min;
204 return split (local).tm_sec;
216 return split (local).tm_wday;
223 return split (local).tm_isdst > 0;
236 tm localtm =
local ();
237 n = localtm.tm_gmtoff;
238 if (daylight) *daylight = localtm.tm_isdst;
243 localtime_s(&localtm, &utctime);
244 int savedaylight = localtm.tm_isdst;
246 gmtime_s(&gmt, &utctime);
248 gmt.tm_isdst = savedaylight;
249 n = utctime - mktime (&gmt);
251 if (daylight) *daylight = savedaylight;
259 #pragma warning(push)
260 #pragma warning(disable:4996)
267 tm localtm =
local ();
268 if (daylight) *daylight = localtm.tm_isdst;
270 return tzname [localtm.tm_isdst > 0 ? 1 : 0];
283 tm time =
split (local);
284 std::string::size_type length = 0;
287 std::string::size_type pos = spec.find(
"%f");
288 if (std::string::npos != pos) {
292 while (std::string::npos != pos) {
293 if (pos != 0 && spec[pos-1] !=
'%') {
294 spec.replace(pos, 2, ms);
296 pos = spec.find(
"%f", pos + 1);
299 const int MIN_BUF_SIZE = 128;
303 result.resize(std::max<std::string::size_type>(result.size()*2,
304 std::max<std::string::size_type>(spec.size()*2, MIN_BUF_SIZE))
306 length = ::strftime (&result[0], result.size(), spec.c_str(), &time);
309 result.resize (length);
324 TimeAssert( (minwidth >= 1) && (minwidth <= maxwidth) && (maxwidth <= 9),
325 "nanoformat options do not satisfy: 1 <= minwidth <= maxwidth <= 9");
330 std::ostringstream buf;
334 std::string out = buf.str();
338 size_t len = out.find_last_not_of(
'0', maxwidth - 1) + 1;
340 out.resize(std::max(len, minwidth));
348 struct tm localtm = time.
local ();
350 unsigned mday = localtm.tm_mday;
351 unsigned mon = localtm.tm_mon + 1;
352 unsigned year = (localtm.tm_year > 80 ? localtm.tm_year - 80 : 0);
353 unsigned sec = localtm.tm_sec / 2;
354 unsigned min = localtm.tm_min;
355 unsigned hour = localtm.tm_hour;
356 return (mday << 16 | mon << 21 | year << 25
357 | sec | min << 5 | hour << 11);
367 memset (&localtm, 0,
sizeof (localtm));
368 localtm.tm_mday = (dosDate >> 16) & 0x1f;
369 localtm.tm_mon = ((dosDate >> 21) & 0xf) - 1;
370 localtm.tm_year = ((dosDate >> 25) & 0x7f) + 80;
371 localtm.tm_hour = (dosDate >> 11) & 0x1f;
372 localtm.tm_min = (dosDate >> 5) & 0x3f;
373 localtm.tm_sec = (dosDate & 0x1f) * 2;
374 localtm.tm_isdst = -1;
376 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.
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.
This is a number of static methods for bootstrapping the Gaudi framework.
int year(bool local) const
Get the year.
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].