问答 百科手机端

ntp编程中的时间转换

2023-05-28 13:46
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 ;

热门