http://bbs.youkuaiyun.com/topics/330029922
#include <sys/time.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
double
difftimeval(const struct timeval *tv1, const struct timeval *tv2)
{
double d;
time_t s;
suseconds_t u;
s = tv1->tv_sec - tv2->tv_sec;
u = tv1->tv_usec - tv2->tv_usec;
if (u < 0)
--s;
d = s;
d *= 1000000.0;
d += u;
return d;
}
char *
strftimeval(const struct timeval *tv, char *buf)
{
struct tm tm;
size_t len = 28;
localtime_r(&tv->tv_sec, &tm);
strftime(buf, len, "%Y-%m-%d %H:%M:%S", &tm);
len = strlen(buf);
sprintf(buf + len, ".%06.6d", (int)(tv->tv_usec));
return buf;
}
char *
getstimeval(char *buf)
{
struct timeval tv;
struct tm tm;
size_t len = 28;
gettimeofday(&tv, NULL);
localtime_r(&tv.tv_sec, &tm);
strftime(buf, len, "%Y-%m-%d %H:%M:%S", &tm);
len = strlen(buf);
sprintf(buf + len, ".%06.6d", (int)(tv.tv_usec));
return buf;
}
int
main(int argc, char *argv[])
{
char buf[28];
struct timeval tv1;
struct timeval tv2;
gettimeofday(&tv1, NULL);
printf("%s\n", getstimeval(buf));
gettimeofday(&tv2, NULL);
printf("%s\n", strftimeval(&tv1, buf));
printf("%s\n", strftimeval(&tv2, buf));
printf("%f\n", difftimeval(&tv2, &tv1));
return 0;
}