timeval为unix时间从1970年开始算,最小单位是微秒。
struct timeval
{
__time_t tv_sec; //秒
__suseconds_t tv_usec; //微秒
}
1、获得系统的timeval
void gettimeval(struct timeval* tv)
{
union {
__int64 ns100;
FILETIME ft;
} now;
GetSystemTimeAsFileTime (&now.ft);
tv->tv_usec = ((now.ns100/10)%1000000); //微秒
tv->tv_sec = ((now.ns100 - 116444736000000000) / 10000000); //1970年以来的秒数
}
//116444736000000000为1601年到1970年的秒数。因windows时间从1601年开始算,最小单位是100ns。
2、ntp时间戳
struct ntptime
{
unsigned int integer; //1900年以来的秒数
unsigned int fraction;//小数部份,单位是微秒数的4294.967296(=2^32/10^6)倍
};
3、timeval到ntp时间戳的转换
ntptime.integar=timeval.tv_sec+JAN_1970;
ntptime.fraction=timeva.tv_usec* 0x100000000/1000000;
其中:
#define JAN_1970 0x83aa7e80 // (2208988800) 1900年到1970年的秒数
4、ntp时间戳转换为1970以来的时间
秒数=ntptime.integar-JAN_1970;
微秒数=ntptime.fraction *1000000/0x100000000 ;