For an error-logbook I want to create a timestamp with date and time, including microseconds. It should have the form 2016.07.19 13:59:31:123.456
I found a lot of examples of time_t
, but the resolution is only seconds...
For an error-logbook I want to create a timestamp with date and time, including microseconds. It should have the form 2016.07.19 13:59:31:123.456
I found a lot of examples of time_t
, but the resolution is only seconds...
You can use gettimeofday
:
#include <time.h>
#include <sys/time.h>
....
struct timeval tv;
gettimeofday(&tv, NULL);
Where struct timeval
is defined as:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
You can then use gmtime
to split the seconds part:
struct tm *ts = gmtime(&tv.tv_sec);
Where struct tm
is defined as:
struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ };
The members of the tm structure are:
tm_sec The number of seconds after the minute, normally in the range 0 to 59, but can be up to 60 to allow for leap seconds.
tm_min The number of minutes after the hour, in the range 0 to 59.
tm_hour The number of hours past midnight, in the range 0 to 23.
tm_mday The day of the month, in the range 1 to 31.
tm_mon The number of months since January, in the range 0 to 11.
tm_year The number of years since 1900.
tm_wday The number of days since Sunday, in the range 0 to 6.
tm_yday The number of days since January 1, in the range 0 to 365.
tm_isdst A flag that indicates whether daylight saving time is in effect at the time described. The value is positive if daylight saving time is in effect, zero if it is not, and negative if the infor- mation is not available.
EDIT:
Windows doesn't have gettimeofday
. Here's an implementation you can use:
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
const unsigned __int64 epoch_diff = 11644473600000000;
unsigned __int64 tmp;
FILETIME t;
if (tv) {
GetSystemTimeAsFileTime(&t);
tmp = 0;
tmp |= t.dwHighDateTime;
tmp <<= 32;
tmp |= t.dwLowDateTime;
tmp /= 10;
tmp -= epoch_diff;
tv->tv_sec = (long)(tmp / 1000000);
tv->tv_usec = (long)(tmp % 1000000);
}
return 0;
}