Windows FILETIME 与UNIX时间的转换

windows FILETIME时间从1601/01/01 零时零分零秒开始计时,windows每个时钟滴答将计数加一,每个时钟滴答的间隔是100 nanoseconds(纳秒,1秒=10的九次方纳秒),即每个时钟滴答= 10 (-7)秒。

unix、linux时间是从1970/01/01零时零分零秒开始计数,每秒计数加1. 197001/01与1601/01/01的时间间隔是11644473600秒。

所以从windows滴答时间转化为unix时间的代码为:

#define WINDOWS_TICK 10000000  //10的7次方
#define SEC_TO_UNIX_EPOCH 11644473600LL //1601与1970的时间间隔

unsigned WindowsTickToUnixSeconds(long long windowsTicks)
{
     return (unsigned)(windowsTicks / WINDOWS_TICK - SEC_TO_UNIX_EPOCH);
}

 从timeval转化为FILETIME的代码为:

void FileTimeToTimeval(FILETIME *pFileTime, struct timeval *pTimeval)
{
    CalcOffsetFrom1601To1970(); //11644473600LL*10^7
    ULONGLONG ul64FileTime = 0;
 
    ul64FileTime |= pFileTime->dwHighDateTime;
    ul64FileTime <<= 32;
    ul64FileTime |= pFileTime->dwLowDateTime;
 
    ul64FileTime -= g_ullOffsetFrom1601To1970;
    pTimeval->tv_sec = (long)(ul64FileTime / 10000000);
    pTimeval->tv_usec = (long)((ul64FileTime % 10000000) / 10);
}

	
void TimevalToFileTime(struct timeval *pTimeval, FILETIME *pFileTime)
{
    CalcOffsetFrom1601To1970();
    ULONGLONG x = pTimeval->tv_sec * NSPERSEC + pTimeval->tv_usec * 10;
    x += g_ullOffsetFrom1601To1970;
    pFileTime->dwHighDateTime = (ULONG)(x >> 32);
    pFileTime->dwLowDateTime = (ULONG)x;
}

 

转载于:https://www.cnblogs.com/stephen-init/p/4042257.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值