美文网首页
时间转换

时间转换

作者: 码农练功房 | 来源:发表于2021-02-18 09:31 被阅读0次

背景

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

unix、linux时间是从1970/01/01零时零分零秒开始计数,每秒计数加1。

1970/01/01与1601/01/01的时间间隔是11644473600秒。

结构体

FILETIME 结构体表示自1601年1月1日以100纳秒为基准的时间间隔。FILETIME 结构体包含2个32位的值,它们组成一个64位的值。

typedef struct _FILETIME {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME;

注意 FILETIME 结构体是以100纳秒为基准的的时间间隔,在使用文件时间时,定义下面的宏是非常有用的。

#define _SECOND ((int64) 10000000)
#define _MINUTE (60 * _SECOND)
#define _HOUR   (60 * _MINUTE)
#define _DAY    (24 * _HOUR)

timeval结构体以1970-01-01 00:00:00 +0000 (UTC),也就是Unix中的Epoch作为0,之后的时间都是相对于Epoch流逝的秒和毫秒数。其中tv_sec是秒,tv_usec是微秒(microsecond ),即10-6秒,而不是毫秒(millisecond),10-3秒。

struct timeval
{
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

转换

timeval(unix linux时间)与FILETIME(windows时间)之间转换的代码为:

//  windows-->linux
void FileTimeToTimeval(FILETIME *pFileTime, struct timeval *pTimeval)
{
    CalcOffsetFrom1601To1970(); //11644473600LL*10^7
    ULONGLONG ul64FileTime = 0;
  //  时间用64bit存储
    ul64FileTime |= pFileTime->dwHighDateTime;
    ul64FileTime <<= 32;
    ul64FileTime |= pFileTime->dwLowDateTime;
  
    ul64FileTime -= g_ullOffsetFrom1601To1970;
    pTimeval->tv_sec = (long)(ul64FileTime / 10000000);
    pTimeval->tv_usec = (long)((ul64FileTime % 10000000) / 10);
}
 //  linux--->windows
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;
}

从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);
}

参考文献:

1.Windows FILETIME 与UNIX时间的转换
2.FILETIME 结构体的研究
3.struct timeval结构体
4.timeval及相关函数

相关文章

  • 时间转换 &&金额转换

  • python时间格式转换

    本地时间转换为时间戳 时间戳转换为本地时间 UTC时间转换为时间戳 本地时间转换为UTC

  • 时间转换

  • 时间转换

    方法一 注意输出方式 方法二 PAT 7-8 时间换算(15 分) 本题要求编写程序,以hh:mm:ss的格式输出...

  • 时间转换

    DATA:seconds_per_day(8)TYPEpVALUE86400, rel_dateLIKEsy-da...

  • 时间转换

    该组件适用于以下场景 1,将时间戳转换成时间显示,支持年,月,日,天,分,秒,毫秒,可以定义自己想要的格式来显示,...

  • 时间转换

    时间戳转换http://www.cnblogs.com/mstk/p/5511057.html时间格式与毫秒的转换...

  • 时间转换

    获取当前时间: date [format] //format like: "+%Y-%d-%m", 注意是以+开头...

  • 时间转换

    返回的师NSString类型

  • 《时间-转换》

    用昨日将忧伤埋葬 痛苦在今日哀悼 未来在明天嘲笑 飞逝的光阴批判着未来

网友评论

      本文标题:时间转换

      本文链接:https://www.haomeiwen.com/subject/qvjgxltx.html