ntp编程中的时间转换
更多文章...

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 ;



© time.org.cn